開発ブログ

ページメニュー

<< 広告などの外部リンクを消して見やすくするブックマークレット | main | 色のアクセシビリティ >>

カレンダー

<< April 2017 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 >>

  • 広告などの外部リンクを消して見やすくするブックマークレット2
  • 先に作ったブックマークレットを某サイトで試してみたら、iFrameを用いた箇所の広告を消すことができなかったので、iFrame対応のブックマークレットを書いてみました。
    iframe対応のブックマークレット

    ソースは以下。
    d=document;tags='a/iframe'.split('/');for(i=0;i<tags.length;i++){t=tags[i];ob=d.getElementsByTagName(t);for(o=0;o<ob.length;o++){switch(t){case 'a':if(ob[o].href.indexOf(d.domain)==-1){ob[o].innerHTML='';}break;case 'iframe':if(ob[o].src.indexOf('http://'+d.domain)==-1){ob[o].src='';}break;}}}void(0);


    iFrameは、別ドメインの場合、ドキュメント本体を参照しようとするとセキュリティエラーを返すので、別ドメインのiFrameがあればsrc属性をnullにするように修正してみました。iFrameについての試行錯誤は下記のとおり。

    1.iFrame内のdocumentを取得してみる
    f=document.getElementsByTagName("iframe");
    ここで
    alert(f.length)
    とすれば、iFrameの数が取得可能。
    FireFox場合、
    f[0].contentDocumentは[object HTMLDocument]
    として扱われます。
    IEの場合、
    f[0].document
    でOK。

    2.オブジェクトの内容を取得
    m="";for(i in document){m+=i+"¥n"}alert(m)
    その中には当然、getElementByIdも存在する。

    3.上記を踏まえ、同じようにしてiFrame内のオブジェクトを取得
    f=document.getElementsByTagName("iframe");m="";for(i in f[0].contentDocument){m+=i+"¥n"}alert(m)
    そうすると、FireBugにより、以下のようなエラーが吐き出された。
    [Exception... "Access to property denied" code: "1010" nsresult: "0x805303f2 (NS_ERROR_DOM_PROP_ACCESS_DENIED)" location: "http://www.test.com Line: XX"]


    結論
    つまり、自身のドメインとiFrameのドメインが異なる場合、セキュリティ上の問題で操作できないということのらしい。。

    その後
    親ドキュメントのiFrameに含む要素なら取得できるだろう、とのことで
    f=document.getElementsByTagName("iframe");m="";alert(f[0].src)
    を実行すると、そのiFrameのsrc要素を取得できました。src要素なら、当然書き込みは問題ありません。

    JavaScriptのセキュリティ制限は年々厳しくなってますね。

| 開発関連 | 05:42 | comments(0) | trackbacks(0) |


コメント

コメントする

この記事のトラックバックURL

http://blog.24th.jp/trackback/903602