Я как раз тоже занимался eval-ом скриптов, когда только-только появился AJAX под .NET, и многие библиотеки не поддерживали его.
Первый момент — лучше добавлять и сразу удалять элемент script в заголовке документа, потому что eval не выполняется в контексте window, и все " function xyz() {} " в скрипте не будут доступны из других скриптов. как вариант писать " window['xyz'] = function() {} ", но мне кажется что это извращение (хотя данный метод используется в некоторых распространённых библиотеках).
Второй момент — выдирать скрипты можно проще :)
var js_ScriptFragment = '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)';
var js_ScriptSrcFragment = '<script.+(src[ ]*=[ ]*\'(.*?)\'|src[ ]*=[ ]*"(.*?)").+';
function js_extractScripts(str)
{
var matchAll = new RegExp(js_ScriptFragment, 'img');
var matchOne = new RegExp(js_ScriptFragment, 'im');
var matchSrc = new RegExp(js_ScriptSrcFragment, 'im');
var arr = str.match(matchAll) || [];
var res = [];
for (var i = 0; i < arr.length; i++)
{
var srcMt = arr[i].match(matchSrc);
if (srcMt)
{
if (srcMt.length > 3) res.push(['src', srcMt[3]]);
else res.push(['src', srcMt[2]]);
}
var mtCode = arr[i].match(matchOne) || ['', ''];
if (mtCode[1] != '') res.push(['code', mtCode[1]]);
}
return res;
}
Использую если задача которую должна реализовывать библиотека не первоочередная.
Я использую libpng, freetype2, ftgl, libogg и иногда lua (хотя мне lua очень не импонирует, возможно перейду на python)
не понял где собственно баг в первом баге? по поводу куда закачать у меня спрашивает (в опциях включить «Ask where to save ...»), при нажатии на download-кнопку («Free Coupwns») файл запускается. По моему нормальное поведение любого браузера.
Например FF3 — скачивает файл. Открыть список закачек и кликнуть два раза. Он тоже запустится.
ваш метод почти аналогичен моему, и обладает теми же недостатками что и мой :)
а кроме того если в Object добавлены новые методы через prototype (так любит делать одноимённая библиотека), то будет не верный результат.
например:
Object.prototype.new_method_1 = function() { /* do something */ }
Object.prototype.new_method_2 = function() { /* do something */ }
оно не работает для таких случаев.
но мне кажется что эти случаи искуственно придуманы, и в реальности будут встречатся несравненно редко (по крайней мере если мне надо было делать юник, то все объекты были однородными (да, и у всех был метод наподобие get_id или get_value, чтобы получать одно ключевое поле))
я про это и писал, что "кстати все варианты, кроме http://rafb.net/p/8Knr8267.html , валятся на '##1'" - все, это и мой в том числе.
а на одиночной # не валится :)
как только найду как исправить, перевыложу.
Первый момент — лучше добавлять и сразу удалять элемент script в заголовке документа, потому что eval не выполняется в контексте window, и все " function xyz() {} " в скрипте не будут доступны из других скриптов. как вариант писать " window['xyz'] = function() {} ", но мне кажется что это извращение (хотя данный метод используется в некоторых распространённых библиотеках).
Второй момент — выдирать скрипты можно проще :)
пару ссылок в тему:
forums.asp.net/t/1045405.aspx
forums.asp.net/t/1062799.aspx
аминь1
Я использую libpng, freetype2, ftgl, libogg и иногда lua (хотя мне lua очень не импонирует, возможно перейду на python)
Например FF3 — скачивает файл. Открыть список закачек и кликнуть два раза. Он тоже запустится.
а кроме того если в Object добавлены новые методы через prototype (так любит делать одноимённая библиотека), то будет не верный результат.
например:
Object.prototype.new_method_1 = function() { /* do something */ }
Object.prototype.new_method_2 = function() { /* do something */ }
arr = [1, 2, 3, 1, 1, 2];
alert(arr.unique());
но мне кажется что эти случаи искуственно придуманы, и в реальности будут встречатся несравненно редко (по крайней мере если мне надо было делать юник, то все объекты были однородными (да, и у всех был метод наподобие get_id или get_value, чтобы получать одно ключевое поле))
я обычно делаю так:
Array.prototype.unique = function() {
var res = [];
var already = {};
for (var i = 0; i < this.length; i++) {
var val = this[i];
if (typeof(already['z'+val]) == 'undefined') {
res.push(val);
already['z'+val] = true;
}
}
return res;
}
PS. 'z'+val а не просто val для корректной работы при случае, когда к Object-у добавлены новые методы через prototype.
хотя в питоне и можно при генерации модифицировать исходный список, но новый всё равно создаётся.
засиживаться после работы - вредно :)
a = [1,2,3,4,1,2,6,9,2,3,8,4,5,76,2,5,6,7]
b = [ e for i,e in enumerate(a) if e not in a[i+1:] ]
print b
не сохраняет порядок? (хотя по идее должен).
у меня в результате [1, 9, 3, 8, 4, 76, 2, 5, 6, 7]
а на одиночной # не валится :)
тоже самое на руби выглядит не особо... http://rafb.net/p/x0A2lg85.html
http://rafb.net/p/tLK1ts77.html
(первый раз на питоне).
кстати все варианты, кроме http://rafb.net/p/8Knr8267.html , валятся на '##1'