У меня возникла небольшая проблема с экранированием кавычек в следующем примере:

var newId = "New Id number for this line";

$(id).html('<td><input type="text" id="my' + newId + '" onKeyUp="runFunction("#my' + newId + '");"></td>');

Проблема в том, что когда я смотрю на сгенерированный код, идентификатор обновляется до id="myNewId", но при вызове функции это выглядит так:

onkeyup="runFunction(" #row2="" );=""

Что именно я делаю не так?

1
rshivers 4 Июн 2010 в 19:01

4 ответа

Лучший ответ

Только не вставляйте JavaScript в строку HTML:

$(id).html(
  '<td><input type="text" id="my' + newId + '"></td>'
).find("input").keyup( function() {
  runFunction("#my" + newId);
});

Подумав об этом, в этом особом случае вы можете заменить тело функции keyup() на:

  runFunction(this);

Потому что вы, кажется, хотите запустить функцию на самом объекте.

7
Tomalak 4 Июн 2010 в 15:07

Вы должны использовать ссылки на символы HTML для значений атрибутов HTML. Попробуй это:

function htmlEncode(str) {
    var map = {"&":"amp", "<":"lt", ">":"gt", '"':"quot", "'":"#39"};
    return str.replace(/[&<>"']/g, function(match) { return "&" + map[match] + ";"; });
}

$(id).html('<td><input type="text" id="my' + newId + '" onKeyUp="' + htmlEncode('runFunction("#my' + newId + '");') + '"></td>');
6
Gumbo 4 Июн 2010 в 15:06

Вы должны использовать экранированные одинарные кавычки \', чтобы окружить часть #my....

0
Pekka 4 Июн 2010 в 15:05

Вы забыли избежать кавычек атрибута.

var newId = "New Id number for this line";

$(id).html('<td><input type="text" id="my' + newId + '" onKeyUp="runFunction(\'#my' + newId + '\');"></td>');
1
Jacob Relkin 4 Июн 2010 в 15:04