2017-04-19 7 views
-2

私はクロムのテスト拡張を行っています。 私の質問:マウスでページ上の要素を選択し、JavaScriptで非表示にするには

マウスで要素を選択して非表示にするイベントスクリプトを作成することはできますか? Shift+Ctrl+Cを押すと、検査要素選択ツールのようなものです。注:私は後にDOMのリフローを望んでいません。ここで

は私のコードです:

content.js:

var elems = document.getElementsByTagName("iframe"); 

$(document).ready(function() { 
    for (var i = 0, max = elems.length; i < max; i++) { 
     elems[i].hidden = true; 
    }; 
}); 

window.onload = function() { 
    for (var i = 0, max = elems.length; i < max; i++) { 
     elems[i].hidden = true; 
    } 
}; 

$(window).load(function() { 
    for (var i = 0, max = elems.length; i < max; i++) { 
     elems[i].hidden = true; 
    }; 
}); 

for (var i = 0, max = elems.length; i < max; i++) { 
    elems[i].hidden = true; 
}; 

はmanifest.jsonを:

{ 
    "manifest_version":2, 
    "name":"Test", 
    "description":"A Basic program", 
    "version":"0.1", 
    "background":{ 
    "scripts":[ 

    ] 
    }, 
    "content_scripts":[ 
    { 
     "matches":[ 
      "<all_urls>" 
     ], 
     "js":[ 
      "jquery-3.2.1.min.js", 
      "content.js" 
     ] 
    } 
    ], 

    "browser_action":{ 
    "default_title":"Test" 
    } 
} 
+0

コードを追加していただきありがとうございます。うまくいけば、あなたの質問を定義するのに役立ちます。しかし、あなたがしたいことはまだ明確ではありません。キーボードショートカットを押したときに選択範囲を非表示にしたいですか?コンテキストメニューのエントリから?どうやって?あなたが[この質問](http://stackoverflow.com/q/43488135/3773011)に投稿したのと同じように見えるコードでさえ、これは私たちがコードを書く要求のようになります。これはA)実際に何かを書くことができるようにあなたの要求はまだ漠然としています。 – Makyen

+0

あなたが既に持っているコードをデバッグしたいのであれば、デバッグの助けを求める質問(「なぜこのコードは私が望むように動作していないのですか?」)には、(1) (3)問題そのものに*再現するのに必要な最短のコード*が含まれています。また、[ここで私はどのような話題を聞くことができますか?](http://stackoverflow.com/help/on-topic)、[ask]を参照してください。含まれているコードが[mcve]であっても、まだ#1(テキストは現在コードと一致しません)と#2を伝える必要があります。 – Makyen

答えて

1

要素を選択するためのさまざまな方法の負荷、および負荷があります。もっと隠すために

まず、chrome.contextMenus.createというコンテキストメニュー項目を追加できます。

キーコード(SHFT+CTRL+Cなど)を処理するには、ページに背景スクリプトが必要です。

この場合、DOMを操作して要素を非表示にすることができます。 element.style.display = 'none'を使用してコンテンツを折りたたむか、またはelement.style.opacity = '0'を使用してページの残りの部分を変更しないで非表示にします。

あなたのソースコードを見てみると:

var elems = document.getElementsByTagName("iframe"); 

OKが、これは彼らがにロードされていると仮定して、ページ内のすべてののタグを取得する必要があり、デフォルトではcontent scripts fire after the DOM is complete but can be before or after the onload event

次は...

$(document).ready(function() { ... 
window.onload = function() { ... 
$(window).load(function() { ... 

これらは、完成した負荷を有する文書にこれをフックするために、異なる試みのように見えます。問題は、window.onloadが既に起動しているかどうかです。 manifest.jsonの中でと"run_at": "document_end"の間でコンテンツスクリプトを実行させることができますが、それはあなたが望むものとは思えません。

インラインスクリプトを使用してDOMから取得した変数elemsがすべて使用されていることに注意してください。イベントが発生する前にが存在しなかった場合は、配列には入りません。

最後に、これらすべてのは、ループに Sをしようとしているように表示されます。

for (var i = 0, max = elems.length; i < max; i++) { 
    elems[i].hidden = true; 
}; 

これは、DOMをリフロー避けるためにelems[i].style.visibility = 'hidden'を使用していますが、大丈夫です。私はあなたの問題は、コンテンツのスクリプトを実行すると、あなたが探している sがページ内にまだないということであると考え

function hideIframes() { 
    const elems = document.getElementsByTagName('iframe'); 
    for (let e of elems) { 
     e.style.visibility = 'hidden'; 
    }; 
} 

// Don't do all of these - pick one that suits your context 
hideIframes(); // Run inline on document_idle 
$(hideIframes); // Run on jQuery complete 
setTimeout(hideIframes, 3000); // Run again in 3s 

:だから(Chromeの拡張機能をサポートしてES6構文を使用)。追加したと思われる特定のイベントに対してチェックを追加する必要があるかもしれません。

+0

あなたの答えはありがたいですが、基本的な例を教えてください。 – Vagif

+0

@Vagifええ、質問はあまりにも曖昧です。これはコンテキストメニューアクションかイベントスクリプトですか?選択中に通常の操作を無効にしたい、要素を隠すか削除しますか?後でDOMリフローをしたいですか? – Keith

+0

私の答えが編集されました – Vagif