我试图调用我插入的html数据中存在的一个javascript函数,但我总是得到一个错误,getLoaded不是一个方法。我附上了代码段。有什么问题?
<canvas width="100%" height="100%" >
<simplelayout axis="y" spacing="2"/>
<button>Set HTML
<handler name="onclick">
<![CDATA[
if (canvas.main) {
canvas.main.setAttribute('html', '<html><head><style type="text/css">body {background-color: #ffffff;}</style><script>function getLoaded(){ return document.images.length;}</script></head><body><img id="imageTag" ></img></body></html>');
}
]]>
</handler>
</button>
<button>test
<handler name="onclick">
<![CDATA[
if (canvas.main) {
var del = new LzDelegate(this,'handlerFunc');
canvas.main.callJavascript('getLoaded',del);
}
]]>
</handler>
</button>
<method name="handlerFunc" args="retVal">
console.log("handlerFunc", retVal);
</method>
<html name="main" x = "50" y="50" width="600" height="400" >
<handler name="oninit">
this.bringToFront();
</handler>
</html>
</canvas>
答案 0 :(得分:3)
这是一个适用于SWF10和DHTML运行时的解决方案。我已经使用IE 9,Firefox和Chrome进行了测试。
您的代码存在两个问题:
1)您要分配给&lt; html&gt;的@html属性的HTML代码段标记不应包含完整的HTML文档结构。以下是iframemanager.js库(OpenLaszlo的一部分)中的JavaScript,用于将HTML代码段分配给iFrame:
,setHTML: function(id, html) {
// must be called after the iframe loads, or it will be overwritten
if (html) {
var win = lz.embed.iframemanager.getFrameWindow(id);
if (win) {
win.document.body.innerHTML = html;
}
}
}
如您所见,html参数的值被赋值给body元素的innerHTML。因此,仅包含您正在生成的HTML文档的正文就足够了。
2)如果您要将JavaScript部分添加到iFrame,则无法将这些部分内嵌到要分配给文档的HTML代码中,但必须创建一个&#39;脚本&#39;您可以在下面的完整示例中看到该元素。如果你也想支持SWF运行时,最有效的方法是创建一个小的外部JavaScript函数,它有一个辅助函数,如下所示。
我为此解决方案创建了两个文件。 LZX文件和名为iFrameHelperFunction.js
的外部JavaScript文件。
以下是LZX文件的修改版本:
<canvas width="100%" height="100%" >
<wrapperheaders>
<script type="text/javascript" src="iFrameHelperFunction.js"></script>
</wrapperheaders>
<simplelayout axis="y" spacing="2"/>
<button>Set HTML
<handler name="onclick">
<![CDATA[
if (canvas.main) {
// Create the HTML content; do not include <html><head><body> structure here,
// since setting the 'html' attribute of an OpenLaszlo <html> tag will set
// the innerHTML property of the iFrame's document.body.
var innerHTML = '<style type="text/css">body {background-color: #ff0000;}</style>'
+ '<img id="imageTag" src="https://www.google.com/images/srpr/logo3w.png"></img>',
jsCode = "function getLoaded() { alert('inside getLoaded()'); return 'getLoaded was called'; }";
canvas.main.setAttribute('html', innerHTML);
lz.Browser.callJS('addJavaScriptToFrame("' + canvas.main.iframeid + '", ' + jsCode + ')');
}
]]>
</handler>
</button>
<button>test
<handler name="onclick">
<![CDATA[
if (canvas.main) {
var del = new LzDelegate(canvas, 'handlerFunc');
canvas.main.callJavascript('getLoaded', del);
}
]]>
</handler>
</button>
<method name="handlerFunc" args="retVal">
Debug.info("handlerFunc", retVal);
</method>
<html name="main" x = "50" y="50" width="600" height="200" >
<handler name="oninit">
this.bringToFront();
</handler>
</html>
</canvas>
首先,我将自定义JavaScript文件添加到页面中:
<wrapperheaders>
<script type="text/javascript" src="iFrameHelperFunction.js"></script>
</wrapperheaders>
然后设置了针对iFrame剪辑的HTML,类似于您的代码。但是,必须使用addJavaScriptToFrame
中定义的辅助函数iFrameHelperFunction.js
添加添加到iFrame HTML页面的任何JavaScript:
function addJavaScriptToFrame(frameId, jsCode) {
var iframeWin = lz.embed.iframemanager.getFrameWindow(frameId);
doc = iframeWin.document;
// Scripts can not be inlined in HTML snippets, but must be created through JavaScript
var scriptEl = doc.createElement('script');
// The JavaScript function or code you want to add
scriptEl.text = jsCode;
// Append the script to the head of the iFrame document
doc.firstChild.appendChild(scriptEl);
}
将JavaScript添加到LZX文件中的iFrame的调用:
lz.Browser.callJS('addJavaScriptToFrame("' + canvas.main.iframeid + '", ' + jsCode + ')');
点击&#34;设置HTML&#34;按钮设置框架的内容,然后单击&#34; test&#34;按钮,用于调用iFrame中的getLoaded()函数。