Проблема с javascript

Приветствую!

Стоит задача парсить чужой сайт в тело нашего сайта, при этом возникла проблема: внутри тега скрипт с помощью document.write формируется другой тег скрипт. При присвоении куска с таким тегом свойству innerHTML произвольного diva создаваеный тег не создается.

Нече непонятно(

Нужно ручками найти вставленный скрипт и вызвать для него eval, либо, если логика скрипта не сложная, попытаться сразу заменить его на html.

проблема в том, что мы так и делаем, но eval вылетает на некоторых скриптах таких. для примера yandex.ru

Да обьясните плиз на пальцах что вы хотите сделать :)

Ну вот я парсю к себе чужой сайт, а в нем js код типа document.write(’’), который отказывается работать.

Надо смотреть почему именно вылетает, скорее всего чего-то не хватает, например подключаемого скрипта или DOM узла. Вообщем без конкретной ошибки ничего не понятно

я может не до конца тоже понял) но думаю проблема в 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 вопрос)