1

[問題]

以下のJSで同じページの他のJSコンテンツ(facebookのいいねボタン)が消える。(Google Chromeのみ) 以下のJSが原因のバグです。

[質問]

なぜバグが起こったのですか?そして、この解決策は正しいですか?心当たりがあれば教えていただけないでしょうか?

"text" に document.open() と document.close() なしで document.write() の部分を持たせようとしました。ただし、他の JS コンテンツが消えることはありませんでした。

【対象コード】

この JavaScript は iframe で実行されます。すると、iframe が iframe に出力されます。

View.prototype.make_iframe = function(id, text) {
  var doc, iframe, isIE;
  iframe = document.createElement("iframe");
  iframe.width = 0;
  iframe.height = 0;
  iframe.id = id;
  document.body.appendChild(iframe);
  doc = iframe.contentWindow.document;
  /* Problem part start */
  doc.write("<html><head></head><body>");
  doc.write(text);
  doc.write("</body></html>");
  /* Problem part end */
};


 View.prototype.get_tag_files = function(dir, fname, data, make_iframe) {
  var xmlObj;
  xmlObj = null;
  if (window.ActiveXObject) {
    xmlObj = new ActiveXObject("Msxml2.XMLHTTP");
  } else {
    xmlObj = new XMLHttpRequest();
  }
  xmlObj.onreadystatechange = function() {
    var i, item, tag, text, _i, _len;
    if (xmlObj.readyState === 4 && xmlObj.status === 200) {
      text = xmlObj.responseText;
      tag = new Tag(data, text);
      tag.replace();
      return make_iframe(fname, tag.get_tag());
    }
  };
  xmlObj.open("GET", dir + fname, true);
  return xmlObj.send(null);
};

[解決]

  /* target part */
  doc.write("<html><head></head><body>");
  doc.write(text);
  doc.write("</body></html>");

  ==>

  /* replaced target part */
  isIE = /MSIE/.test(window.navigator.userAgent);
  if (!isIE) {
    doc.clear();
    doc.open;
  }
  doc.write("<html><head></head><body>");
  doc.write(text);
  doc.write("</body></html>");
  if (!isIE) {
    return doc.close();
  } else {
    return;
  }

To : 最初のコメント者

ご回答ありがとうございます。

appendChild 関数を使用してみました。しかし、うまくいきません。「テキスト」変数には、他のサーバーからデータを取得する HTML および JS タグがいくつかあります。document.write 関数の代わりに appendChild を使用した場合、タグはネットワーク経由で他のサーバーと通信できません。原因はわかりません。

このコードは、コーヒー スクリプト コンパイラによって生成されます。また、コーヒー スクリプト コードにはビュー クラスがあるため、コードにはプロトタイプがあります。元のコード(コーヒースクリプト)は次のとおりです。

Tag = require("../src/tag").Tag

class View
    constructor: (data) ->
        @validated = data
        @viewid = "product"

    make_iframe: (id,text) ->
        iframe = document.createElement("iframe")
        iframe.width = 0
        iframe.height = 0
        iframe.id = id
        document.body.appendChild(iframe)
        doc = iframe.contentWindow.document
        isIE = /MSIE/.test(window.navigator.userAgent)

        if !isIE
            doc.clear()
            doc.open
        doc.write("<html><head></head><body>")
        doc.write(text)
        doc.write("</body></html>")
        if !isIE
            return doc.close()
        else
            return

    get_tag_files: (dir,fname,data,make_iframe) ->
        xmlObj = null
        if window.ActiveXObject
            xmlObj = new ActiveXObject("Msxml2.XMLHTTP")
        else
            xmlObj = new XMLHttpRequest()
            xmlObj.onreadystatechange = ->
            if xmlObj.readyState == 4 && xmlObj.status == 200
                text = xmlObj.responseText
                tag = new Tag(data, text)
                tag.replace()
                make_iframe(fname,tag.get_tag())
            xmlObj.open("GET", dir+fname, true)
            xmlObj.send(null)

    output_tags: (tags, path) ->
        for tag in tags
            @get_tag_files(path, tag, @validated, @make_iframe)

        return """
               """

exports.View = View
4

0 に答える 0