blog

Hikvision Webプラグイン対応iframeピットの実践

理由\nHikvision 3.1開発ガイドでは、明確に現在、唯一のdivタグの使用をサポートしていることを指摘し、方法に基づいてiframeの使用もブラウザのページのポップアップページの使用をサポー...

Feb 22, 2020 · 3 min. read
シェア

理由

Hikvisionの3.1開発ガイドは、明確に、現時点では、唯一のdivタグの使用をサポートしていることを指摘し、iframeベースの方法の使用もサポートしていないブラウザのページのポップアップページの使用をサポートしていません。

クライアントからのiframe適応のリクエストにより

問題1:ネストされたiframe、クロスドメインの問題。

コンソールを表示すると、Haikangプラグインのソースコードが現在のブラウザのタイトルを取得できないことを示唆するエラーが報告され、問題が発生します。

解決方法

ソースコードから該当するコードを削除

問題2:クロスドメインの解像度、ビデオプラグインの初期化位置に問題あり

調査の結果、プラグインの初期化位置がブラウザの初期位置に基づいているため、ビデオプラグインの位置が iframe の相対位置で初期化されないことがわかりました。

解決策:親ウィンドウは、iframe の offset.top と offset.left の相対位置を iframe ウィンドウ内の video プラグインに渡します。そして、video プラグインは、相対位置に応じてプラグインを初期化し、window.postMessage() メソッドを使用する必要があります。

サブ

 <div id="myVideo" style="margin-left:20%;width: 80%;height: 60%; ">
 <iframe src="url" width="100%" height="100%" id="iframe"></iframe>
 </div>
 function fd(wait) {
 let timer = null
 return function () {
 if (timer != null) clearTimeout(timer)
 timer = setTimeout(() => {
 postIframe()
 console.log('揺れ防止トリガー関数');
 }, wait)
 }
 }
 let myfd = fd(1000)
 window.onresize = function () { 
 myfd()
 }
 window.onload=function(){
 postIframe()
 }
 function postIframe() {
 let myMessage = $('#myVideo').offset() // iframeブラウザのオフセットtopとleftを基準にする。
 let parentHeight = $('#myVideo').height() //iframeウィンドウサイズ
 let parentWidth = $('#myVideo').width() // //iframeウィンドウサイズ
 
 var receiver = document.getElementById('iframe').contentWindow;
 receiver.postMessage({ parentHeight, parentWidth, myMessage }, '*');
 }

地上第1支部:午後11時~午前1時、真夜中

 function changeVideo() {
 //dom要素を操作して、プラグインのウィンドウ・サイズを変更する。
 $("#playWnd").css("width", newWidth + "px");
 $("#playWnd").css("height", newheight + "px");
 //dom要素を操作して、ブラウザに対するプラグインの相対位置を変更する。
 $("#playWnd").css("margin-top", Number(inittop) + 1 + "px");
 $("#playWnd").css("margin-left", Number(initLeft) + 1 + "px");
 if (oWebControl != null) {
 oWebControl.JS_Resize(newWidth, newheight);
 $(".hikRight").css("left", newWidth - 11 + "px"); 
 }
 }
 $(function () {
 //メッセージを聞く
 window.addEventListener('message', function (e) {
 
 // console.log(e.data) //e.data渡されたデータ
 inittop = e.data.myMessage.top
 initLeft = e.data.myMessage.left
 newheight = e.data.parentHeight
 newWidth = e.data.parentWidth 
 changeVideo() //ウィンドウの位置は、dom
 videoTimer = setTimeout(() => {
 $("#playWnd").css("margin-top", 0 + "px");
 $("#playWnd").css("margin-left", 0 + "px"); 
 }, 1000)
 })
 
 //プラグインを初期化する
 initPlugin()
 })

問題3:ビデオプラグインのちらつき

研究ソースコードは、initPlugin()とinit()関数がロードされたプラグインが、異なる方法でロードされたことがわかりました。 initPlugin()は、divの場所を計算するために、現在のiframeを介してinit()divの場所を計算するために、ブラウザのウィンドウを介してロードされ、その結果、2つのプラグインは、プラグインのちらつきをもたらし、同じ表示場所ではないということです。

解決策:init()関数の初期化に成功したら、プラグインの場所をiframeの場所に設定します。

 .then(function (oData) {
 oWebControl.JS_Resize(newWidth, newheight) 
 // Firefoxでウィンドウを最初に表示した後、プラグインウィンドウがDIVウィンドウと重ならない問題を避けるために、初期化後に一度サイズを変更する。
 $("#playWnd").css("margin-top", -1 + "px");
 $("#playWnd").css("margin-left",0+ "px");
 })
Read next

継承

継承。 コンストラクタのメソッド以外はすべて継承します。 プライベートプロパティに直接アクセスすることはできませんが、他の方法でアクセスすることはできます。 継承には欠点もあり、親クラスが変更されると子クラスも即座に影響を受けます。 継承を書かない場合、デフォルトではObjectを継承することになります。 ObjectにはtoString();メソッドがあります。

Feb 22, 2020 · 2 min read