я может не до конца тоже понял) но думаю проблема в innerHTML (как известно, вложенные теги скрипт и form (и еще, возможно, таблицы)) эта фнк. не поддерживает. То есть нельзя внутрь тега script записать еще один тег script через innerHTML.
Для решения этой проблемы я использую такие фнк (по такому принцыпу работает и метод .html() в jQuery):
вот мой код:
//расширяем прототип Array методом map()
//описание и код взят с: https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference:Objects:Array:map
if (!Array.prototype.map) {
Array.prototype.map = function(fun /*, thisp*/){
var len = this.length >>> 0;
if (typeof fun != "function")
throw new TypeError();
var res = new Array(len);
var thisp = arguments[1];
for (var i = 0; i < len; i++){
if (i in this)
res[i] = fun.call(thisp, this[i], i, this);
}
return res;
};
}
,
//фнк вырезает с content все теги <script />
stripScripts : function(content) {
if (!content) return "";
var s_re = '<script[^>]*>([\\S\\s]*?)<\/script>';
return content.replace(new RegExp(s_re, 'img'), '');
},//end stripScripts()
//фнк исполняет все скрипты находящиеся в строке content
evalScripts : function(content) {
if (!content) return "";
return mui.extractScripts(content).map(function(script) { return mui.globalEval(script) });
},//end evalScripts()
//фнк выделяет скрипты со строки content в массив
extractScripts : function(content) {
var s_re = '<script[^>]*>([\\S\\s]*?)<\/script>',
matchAll = new RegExp(s_re, 'img'),
matchOne = new RegExp(s_re, 'im');
return (content.match(matchAll) || []).map(function(scriptTag) {
return (scriptTag.match(matchOne) || ['', ''])[1];
});
},//end extractScripts()
// Evalulates a script in a global context
// большинство кода взято с jquery v1.3.2
globalEval: function( data ) {
var root = document.documentElement,
script = document.createElement("script"),
id = "script" + (new Date).getTime(),
scriptEval = false;
script.type = "text/javascript";
try {
script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
} catch(e){}
root.insertBefore( script, root.firstChild );
// Make sure that the execution of code works by injecting a script
// tag with appendChild/createTextNode
// (IE doesn't support this, fails, and uses .text instead)
if ( window[ id ] ) {
scriptEval = true;
delete window[ id ];
}
root.removeChild( script );
if ( data && /\S/.test(data) ) {
// Inspired by code by Andrea Giammarchi
// http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
var head = document.getElementsByTagName("head")[0] || document.documentElement,
script = document.createElement("script");
script.type = "text/javascript";
if (scriptEval){
script.appendChild( document.createTextNode( data ) );
}
else
script.text = data;
// Use insertBefore instead of appendChild to circumvent an IE6 bug.
// This arises when a base node is used (#2709).
head.insertBefore( script, head.firstChild );
head.removeChild( script );
}
},//end globalEval()
этот код для использования нужно чуток переработать… но в целом должно работать (не могу полный скрипт сейчас показать… он запаролен).
а использовать это все так:
$(attr.jtarget).innerHTML = mui.stripScripts(html);
mui.evalScripts(html);
Или можете покопаться в исходнике jquery-вского метода html(). Если будет непонятно примерчик сделаю. Но это конечно не по yii вопрос)