[問題]
以下の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