0

我为 Flash 嵌入了以下简单对象:

<object id="siwp_obj"
        type="application/x-shockwave-flash" 
        data="button.swf?file=%2F/ex.php?id=89804c7326e92a00c5c88c181190af8159cf060b"
        height="32" width="32">
    <param id="siwp_param" name="movie"
           value="button.swf?file=%2F/ex.php?id=89804c7326e92a00c5c88c181190af8159cf060b" />
</object>

我想要做的是用id浏览器生成的新 ID 替换参数。

我试过这个,它适用于 Firefox,但不适用于 Chrome 或 IE9。Firefox 成功更新了参数,因此 Flash 对象引用了新 ID,但 Chrome 和 IE9 不更新 ID,或者导致任何脚本错误或警告。

var cid = "randomstring";
var obj = document.getElementById('siwp_obj');
// get the "data" attribute which contains the URL with an old id to replace
obj.setAttribute('data', obj.getAttribute('data').replace(/[a-zA-Z0-9]{40}$/, cid));

obj = document.getElementById('siwp_param');
obj.value = obj.value.replace(/[a-zA-Z0-9]{40}$/, cid);

我试图假设没有可用的 javascript 库,因为这将在插件系统中使用。

有没有人对如何动态更新对象和参数标签的 URL 有任何想法?

编辑:

在 Chrome 中,我做了一些调试,注意到参数正在更新,但是当我与 flash 交互时,它并没有重新加载。

例如:

var obj = document.getElementById('siwp_obj');
alert(obj.getAttribute('data')); // the old URL with old ID
obj.setAttribute('data', obj.getAttribute('data').replace(/[a-zA-Z0-9]{40}$/, cid));
alert(obj.getAttribute('data')); // the new URL with new ID

...但是当我单击 flash 对象以尝试从新 URL 流式传输时,它仍然引用具有旧 ID 的旧 URL。因此 DOM 正在更新,但浏览器随后丢失了对象的某些参数已更改的事实。有什么想法吗?

4

2 回答 2

1

我相信最好的办法是动态地创建整个元素(而不是在将其加载到页面后将其作为 getElementById() 来处理。

因此,document.createElement("object");除了document.createElement("param")添加所有属性,然后将appendChild()其添加到某个父节点之外……我相信这应该可以工作(尽管我还没有测试过)。

于 2012-04-24T21:31:38.333 回答
0

我能够通过更新 dom 元素使其工作,然后创建一个克隆并在文档中替换它。

这适用于 IE6+、Firefox 和 Chrome(尚未在任何其他设备中测试)。

// update object and param tag with new id
var obj = document.getElementById('siwp_obj');
obj.setAttribute('data', obj.getAttribute('data').replace(/[a-zA-Z0-9]{40}$/, cid));
var par = document.getElementById('siwp_param'); // this was a comment...
par.value = par.value.replace(/[a-zA-Z0-9]{40}$/, cid);

// replace old flash w/ new one using new id
// clone the original object tag and then insert the clone, remove the original
var newObj = obj.cloneNode(true);
obj.parentNode.insertBefore(newObj, obj);
obj.parentNode.removeChild(obj);
于 2012-04-27T01:48:52.613 回答