У меня есть следующие
var id='123';
newDiv.innerHTML = "<a href=\"#\" onclick=\" TestFunction('"+id+"', false);\"></a>";
Что отображает <a href = "#" onclick = "return Testfunction('123',false);"></a> в моем HTML.
У меня проблема в том, что я хочу принять вызов метода TestFunction и использовать его в качестве строкового параметра в моей функции StepTwo (string, boolean), что в идеале должно закончиться в живом HTML, как показано ...
<a href = "#" onclick = "StepTwo("TestFunction('123',false)",true)"></a>
обратите внимание, что TestFunction здесь является строкой (она выполняется в StepTwo с использованием eval).
Я попытался отформатировать свой JS следующим образом:
newDiv.innerHTML = "<a href=\"#\" onclick=\"StepTwo(\"TestFunction('"+id+"', false);\",true)\"></a>";
но хотя мне это кажется правильным в моей IDE, в обработанном HTML, это невероятно искажено.
Был бы признателен, если бы кто-нибудь мог указать мне в правильном направлении. Спасибо!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы должны использовать ", а не " или \" внутри строки HTML, заключенной в двойные кавычки.
NewDiv.innerHTML = "<a href=\"#\" onclick=\"StepTwo("TestFunction('"+id+"', false);",true)\"></a>";
Вероятно, есть лучший способ сделать это - каждый раз, когда вы обнаруживаете, что используете eval(), вы должны отступить и искать другое решение.
Попробуйте использовать & quot; вместо \"
newDiv.innerHTML = "<a href = & quot; # & quot; ...
Вы можете создать элемент a и присоединиться к событию щелчка с помощью методов DOM.
Javascript Framework (например, вездесущий jQuery) значительно упростит это.
Вам нужно чередовать ваши "и".
Возможно, вам не нужны кавычки вокруг 123 из-за гибкого набора текста в Javascripts. Передайте его без кавычек, но рассматривайте его как строку в TestFunction.
Ваша самая большая проблема - это использование eval, это приводит к такому количеству потенциальных проблем, что почти всегда лучше найти альтернативное решение.
Ваша непосредственная проблема в том, что у вас действительно есть
<a href = "#" onclick = "StepTwo("></a>
поскольку следующий " после начала атрибута onclick закрывает его. Используйте & quot; как предлагали другие. И не используйте eval.
Одна из самых больших неудач в Интернете - создание HTML в javascript путем склеивания строк.
var mya = document.createElement("a");
mya.href = "#";
mya.onclick = function(){
StepTwo(function(){
TestFunction('123', false );
}, true );
};
newDiv.innerHTML = "";
newDiv.appendChild(mya);
Это устраняет необходимость в каких-либо необычных вещах для бегства.
(Я, вероятно, должен сделать onclick по-другому, но это должно сработать, я изо всех сил стараюсь не просто использовать код jQuery, чтобы делать все)
Вот как я бы сделал это в jQuery:
jQuery(function($){
var container = $("#container");
var link = document.createElement("a"); /* faster than $("<a></a>"); */
$(link).attr("href", "Something ( or # )" );
$(link).click( function(){
var doStepTwo = function()
{
TestFunction('123', true );
};
StepTwo( doStepTwo, false ); /* StepTwo -> doStepTwo -> TestFunction() */
});
container.append(link);
});
Все, что он делает, - это накладные расходы ДОБАВЛЯТЬ на синтаксический анализ html обратно в структуры dom и потенциал ДОБАВЛЯТЬ для сломанного HTML на основе XSS. Даже любимый гугл ошибаются в некоторых своих рекламных сценариях и вызывают эпические неудачи во многих случаях, которые я видел (и они не хотят об этом знать).
Я не понимаю Javascript - единственное оправдание, а НЕТ - хорошее.
К вашему сведению - конкатенация строк намного быстрее. Полезно, скажем, для сетки с 1000 строками.
Лучше всего создать элемент с помощью document.createElement, но если вы не хотите, я думаю, вы можете сделать <a href = "#" onclick = "StepTwo('TestFunction(\'123\',false)',true)"></a> или использовать ".
В вашем коде:
newDiv.innerHTML = "<a href=\"#\" onclick=\"StepTwo('TestFunction(\'"+id+"\', false);\',true)\"></a>";
Если не работает, попробуйте заменить «\'» на «\\'».
Помните, что символ "используется для открытия и закрытия атрибута в тегах HTML. Если вы используете его в значении атрибута, браузер распознает его как закрывающий символ.
Пример:
<input type = "text" value = "foo"bar"> в конечном итоге будет <input type = "text" value = "foo">.
Привет, ребята, спасибо за все ответы. Я считаю, что quot; кажется, работает лучше всего.
Я отдам вам несколько голосов, как только заработаю больше репутации!
Что касается eval (), то в вопросе вы видите очень маленький снимок разрабатываемого приложения. Я понимаю проблемы eval, однако это одна из тех ситуаций из миллиона, когда это правильный выбор для данной ситуации.
Было бы лучше понять, если бы вы могли видеть, что делают эти функции (дали им очень общие имена для stackoverflow).
Еще раз спасибо!
Скорее всего, если вы думаете, что нашли законное оправдание для eval, то вы просто недостаточно знаете о javascript / dom.
(Эффективное использование затворов превосходит Eval в 99/100 раз)
Разобрался, а это 1/100 раз. Ваше здоровье. Хотел бы я поговорить об этом подробнее, но это не мое место, чтобы говорить о конкретном коде, над которым я работаю.
Вы утверждаете, что eval - это правильное решение. Я не совсем уверен.
Вы рассматривали этот подход:
<a href = "#" onclick = "StepTwo(TestFunction,['123',false],true)"></a>
и в вашей функции StepTwo
function StepTwo(func,args,flag){
//do what ever you do with the flag
//instead of eval use the function.apply to call the function.
func.apply(args);
}
еще раз спасибо. элегантный. Но eval здесь верен в контексте нашего приложения. (смеется, желаю, чтобы я поместил отказ от ответственности в свой исходный пост об eval!). В любом случае большое спасибо. :-). Если бы StepTwo делал НИЧЕГО отличное от того, что делает сейчас, я бы избегал eval.
Мой ответ не только для вас. Это также для всех, кто ищет ответы на похожие вопросы. Для них eval, вероятно, не подходящее решение. Однако вы меня заинтриговали. Какова ключевая причина, по которой eval здесь?
Привет, извини, но мне нельзя говорить. Я бы вставил код из работы, которая технически принадлежит компании, для которой я ее пишу. Я уверен, что не будет особой суеты, но я бы предпочел перестраховаться. Надеюсь ты понимаешь.
<a href = "#" onclick = "StepTwo('TestFunction(\'123\', false)', true)">...</a>
Я знаю, что это чертовски старый, но если у кого-то есть проблемы с экранированными строками при использовании eval (и вам абсолютно необходимо использовать eval), у меня есть способ избежать проблем.
var html = '<a href = "#\" onclick = " TestFunction(\''+id+'\', false);"></a>';
eval('(function(div, html){div.innerHTML = html;})')(newDiv, html);
Итак, что здесь происходит?
eval создает функцию, содержащую два параметра, div и html, и возвращает ее.В этом случае
var myNewMethod = eval('(function(div, html){div.innerHTML = html;})');
в основном то же самое, что:
var myNewMethod = function(div, html){div.innerHTML = html;}
а затем мы просто делаем это:
myNewMethod(newDiv, html); //where html had the string containing markup
Я бы посоветовал не использовать eval. Если этого нельзя избежать или если вы контролируете все входные данные и нет риска инъекции, это поможет в тех случаях, когда возникает проблема с экранированием строк.
Я также предпочитаю использовать Function, но он небезопасен.
Вот фрагмент, который я использую:
var feval = function(code) {
return (new Function(code))();
}
опять же, прямо в то же время другой ответ. Хотел бы я отметить оба как выбранные правильные ответы. Подниму несколько голосов, когда у меня будет 15+ репутации. Спасибо, что нашли время помочь.