javascriptでGoogleChromeの拡張の開発中に問題が発生しています

このQ&Aのポイント
  • 現在javascriptでGoogleChromeの拡張を開発中ですが、サイトにアクセスした際のクリックがうまく機能しません。
  • ローカルでは正常に動作するのですが、実際のサイトで試してみるとうまくいきません。
  • 問題はDOMの読み込みタイミングや正規表現の部分にある可能性があります。ご教授いただけると幸いです。
回答を見る
  • ベストアンサー

chrome拡張 javascript

現在javascriptでGoogleChromeの拡張を開発中です。 サイトにアクセスした際「http://abc.com/(ワイルドカード)3」があればクリックしたいと思います。 ローカルでは動きましたが、実際のサイトで試してみるとうまくいきません。 DOMの読み込みのタイミングかと思いましたが、それも違っていたようで、正規表現の部分が少し怪しいです。 chromeの拡張のmanifestのrun_atはデフォルトです。 javascriptの記述が悪いのか、chromeの仕様なのか、サイトが対応できないのか、ご教授頂ければ幸いです。 宜しくお願い致します。 <html> <head> </head> <body> <a href="http://abc.com/">abc</a> <a href="http://abc.com/?a=1&b=2&c=3">abc</a> <script type="text/javascript"> targetClick("http://abc.com/*3"); function targetClick(targetURL){ splitURL = targetURL.split("*"); xLink = document.getElementsByTagName("a"); for (i = 0; i < xLink.length; i++) { xHref = xLink[i].getAttribute("href"); if (xHref.match(new RegExp("^" + splitURL[0])) != null) { if (xHref.match(new RegExp(splitURL[1] + "$")) != null) { xClick = document.createEvent("MouseEvents"); xClick.initMouseEvent("click",true,true,window,1,0,0,0,0,false,false,false,false,0,null); xLink[i].dispatchEvent(xClick); } } } } </script> </body> </html>

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

そのままでは正規表現で使えない文字とかを、ちゃんとエスケープしてますか?

fdafgagvrv
質問者

お礼

理由は分りませんが、正規表現をmatchからtestに変えるとうまくいきました。 おっしゃる通り、エスケープ関連のような気がします。 ご回答頂き誠にありがとうございました。

その他の回答 (2)

回答No.2

ミスった~。     var evt = document.createEvent ("MouseEvents"); を、     var evt = doc.createEvent ("MouseEvents"); に。 -- function (a) { if (this.test (a.href)) a.click () },

fdafgagvrv
質問者

補足

ご回答ありがとう御座います。 しかし、ローカルのみでの動作で実際のサイトでは機能しませんでした。 やはり他の何かが原因のようです。 chromeで右クリックからの「ページのソースを表示」ではしっかりとリンクがあります。 下記のサンプルでは目的のリンクが出てきましたので、DOMの読み込みタイミングではなさそうです。 ここから正規表現の選別を入れるとおかしくなります。 targetClick("http://abc.com/*3"); function targetClick(targetURL){ splitURL = targetURL.split("*"); xLink = document.getElementsByTagName("a"); for (i = 0; i < xLink.length; i++) { xHref = xLink[i].getAttribute("href"); alert(xHref); } }

回答No.1

function targetClick (targetURL) {  Array.prototype.forEach.call (   document.getElementsByTagName ('A'),   function (a) {    if (this.test (a.href)) {     var doc = a.ownerDocument;     var evt = document.createEvent ("MouseEvents");     evt.initMouseEvent ("click",true,true,doc.defaultView,1,0,0,0,0,false,false,false,false,0,null);     a.dispatchEvent (evt);    }   },   new RegExp ('^' + targetURL.replace (/([\/\.?])/g, '\\$1').replace ('*', '.*?'))  ); }

関連するQ&A

  • javascriptに詳しい方

    下のスクリプトで見るべきページが二つ以上ある場合どのように記述すればいいのでしょうか? javascriptに詳しい方よろしくお願いいたします。 <html> <head> <script language="JavaScript"> <!-- var isClicked = false; //--> </script> </head> <body> <A href="check.html" onClick="isClicked = true">見るべきページ</a><br> <A href="test.html" onClick="if (!isClicked){ alert('先に見るべきページをクリックしてください'); return false; }">A</a><br> </body> </html>

  • javascriptの実体参照?

    現在googlechromeの拡張の開発の為に、javascriptにチャレンジしています。 やりたいことは不特定のサイトにアクセスした時、ソースを取得して、正規表現でマッチするURLがあればそのURLにジャンプするといった事です。 その際、URLの中に「&」があれば「&amp」に変換されてしまいます。 下記の記述で「document.write(xURL);」に書き換えると「&」のままで思い通りに出力できましたが、「location.href = xURL;」の場合は「&amp」に変換されてしまいます。 ジャンプするサイトが対応していないか、chromeが対応していないか、そもそもjavascriptの記述が間違っているか、判断がつきません。 ご教授頂ければ幸いです。宜しくお願い致します。 //////////////////// ソースから検索してジャンプしたいURLは「http://abc.com/(ワイルドカード)123」のようなものです。 xSource = document.getElementsByTagName("html")[0].innerHTML; if ((xURL = xSource.match(/http:\/\/abc\.com\/.*?123/)) != null) { location.href = xURL; }; ////////////////////

  • JavaScript 遷移中止できない

    下記のようなコードで 「本当に画面遷移してもいいですか?」にいいえを答えたら、 falseが返され、遷移が中断されるようにしたかったのですが、 遷移してしまいます。 なぜか考えてもわからないので、ご存知の方がいたら教えて頂きたいです。 <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> </head> <body> <a href="https://www.--------">サイトへ遷移します</a> <script language="javascript" type="text/javascript"> function func_check(){ if( confirm("本当に画面遷移してもいいですか?") ) { return true; } else { return false; } } </script> </body> </html>

  • javascriptのconfirmについて

    javascriptのconfirmが実行されると確認ダイアログボックスが表示されるはずですが、 何故か何も表示されず、必ずfalseを通ります。 かなり初心者的ミスを侵している気がしますが、調べても分からなかったので、 どなたかご教授頂ければ幸いです。記述したソースは以下になります。 headタグ内 <script type="text/javascript"> <!-- function confirm(s){ if(window.confirm('実行します')){ location.href = "/?flg="+s; } return false; } // --> </script> ■bodyタグ内 <a href="javascript:confirm('1');return false;">テスト</a>

  • JavaScript でキーを送る

    JavaScript でキーを送る のはどうしたらいいのでしょうか。 キーボードからではなく、自動的に任意のキーを押させたいのです。 // aキーのkeydownイベントを起こす var _e = document.createEvent("KeyboardEvent"); _e.initKeyEvent("keydown", true, true, null, false, false, false, false, 65, 0); document.getElementById("dummy").dispatchEvent(_e); いろいろ検索して上記のも試しましたが、IE8では動作が確認できませんでした。 IEじゃ無理なんでしょうか。

  • phpソースの中のjavascriptを実行する方法

    現在、AJAXの勉強をしているプログラミング初心者です。 環境はapache2,php5です。 phpのソースの中にjavascriptを埋め込んだものを動作させるには どうしたらよいのかが分かりません、 例えば以下の2つのファイルの場合。 abc.php↓ --------------------------------------------------------------- <html> <head></head> <body> <?php echo "こんにちわ"; ?> <script tyep="text/javascript"> alert("hello"); </script> </body> </html> --------------------------------------------------------------- abc.html↓ --------------------------------------------------------------- <html> <head> <script> try{ var obj= new ActiveXObject("Microsoft.XMLHTTP");} catch(e){var obj=new XMLHttpRequest();} function load(point){ obj.open("POST","abc.php",true); obj.send(null) obj.onreadystatechange=change; } function change(){ if(obj.readyState==4){ document.getElementById("target").innerHTML=obj.responseText; } } </script> </head> <body> <div id="target"></div> <a href="#" onclick="load();">click!</a> </body> </html> --------------------------------------------------------------- としたところ、 abc.phpを実行した場合はabc.phpのjavascriptが実行されてアラートがでるのですが、 abc.htmlからabc.phpにリクエストを出して出力された場合には、 javascriptが実行されずにアラートが出ない。 どうしてこのようになるのでしょうか? また解決策があれば教えてください。 よろしくお願いします。

  • Google Chrome Bookmark

    いわゆる「お気に入りに登録ボタン」をブラウザごとに表示させたいんですが、 <a href="javascript:void(0)" onclick="javascript:window.external.AddFavorite('url','title'); return false;">IE お気に入り</a> <a href="url" rel="sidebar" title="">Firefox/Opera ブックマーク</a> と言う感じで、ブラウザによって処理を変えていて・・。 SafariとChromeって「ctrl+D」だよな? <a onclick="javascript:alert(' ctrl+D で追加してください。');">Safari/Chrome ブックマーク</a> というのは味気ない・・。 なにかいい方法ありませんか? できればクリックで「ブックマーク」に保存できる「リンク」が作りたいのですが・・

  • JavaScript フレーム

    Javascriptをふたつ書くことはできないんですか? 2つ書いたら「い」のほうしか宣言されないんでどうしたらよろしいですか? Update.java,kensaku2.java syouhin_kensaku.html,syouhin_master.html <html> <head> <title>メニュー</title> </head> <body> <script type="text/javascript"> <!-- function jump(){ // 設定開始(表示するフレーム名とリンク先URLを設定してください) parent.hakusi.location.href = "syouhin_kensaku.html"; parent.hakusi2.location.href = "Update"; // 設定終了 } // --> </script> <a href="#" onClick="jump(); return false;">あ</a> <br> <br> <script> <!-- function jump(){ parent.hakusi.location.href = "syouhin_master.html"; parent.hakusi2.location.href = "kensaku2"; //設定終了 } // --> </script> <br> <a href="#" onClick="jump(); return false;">い</a> <br> <br> </body> </html>

  • 戻り読みの代わりとなる正規表現について

    正規表現を使いたいのですが、 javascriptでは戻り読み表現が使えないと知って困っています・・・ <a href="http://abc.com/"><img src="http://image.abc.com/def.jpg"></a> <a href="http://hogehoge.com/"><img src="http://hogehoge.com/hoge.jpg"></a> <a href="http://123.com/"><img src="http://456.com/789.jpg"></a> <a href="http://momomo.com/"><img src="http://lelele.com/momo.jpg"></a> 上記のソースから http://image.abc.com/def.jpg http://hogehoge.com/hoge.jpg http://456.com/789.jpg http://lelele.com/momo.jpg だけをマッチさせたいです。 (画像のパスだけをマッチさせたい) URLは今後も増える可能性があり、サイト名、文字数、画像名などもバラバラです。 うまくマッチさせる方法はありますでしょうか。 詳しい方いらっしゃいましたらよろしくお願いします!

  • javascript「replace」について

    URLを取得した後、そのURLを置換したいのですが http://www.xxxxx.com/a=123456/b=12345678 ※「a=」、「m=」の後ろの数字は変化します というものを、 http://www.xxxxx.com/12345678/123456 「a=」、「b=」の数字部分のみ前後逆にして置換したいのですが やり方が分かりません。 どこかの掲示板で var aTag = document.getElementsByTagName('a'); var i = 0; for( i = 0; i < aTag.length; i++ ) { if( aTag[i].href.indexOf( '/www.xxxxx.com' ) > -1 ) { aTag[i].href = aTag[i].href.replace( '/www.xxxxx.com', '/www.xxxxx.jp' ); } if( aTag[i].href.indexOf( '/www.xxxxx.com' ) > -1 ) { aTag[i].href = aTag[i].href.replace( '/www.xxxxx.com', '/www.xxxxx.jp' ); } } とすればリンク先を取得して http://www.xxxxx.com を http://www.xxxxx.jp に置換できるというのは分かったのですが、 変動する数字も取得して、任意の文字列にというのができません。 matchやsliceなども試してみたのですが、 いかんせん初心者なため動作が理解できていません。 ご存知の方がいらっしゃいましたら、ご教示下さい。 よろしくお願いいたします。

専門家に質問してみよう