развертывание строки в кавычках внутри другой строки - PullRequest
0 голосов
/ 07 мая 2009

У меня есть две переменные, содержащие некоторый HTML-код, и еще одна переменная, содержащая код для HTML-формы. Я пытаюсь развернуть строку за секунду, чтобы передать ее в качестве параметра функции, однако это вызывает некоторые ошибки.

Моя функция создания всплывающего окна очень проста:

function popup(htmlcode){
child1 = window.open ("about:blank");
child1.document.write(htmlcode);
child1.document.close(); 
}

Код, который использует вышеуказанную функцию

<?php
$blah = "<h1>Well</h1>"; $test = "<h2>Done</h2>";
echo '<script type="text/javascript" src="fetchlayers.js"></script>';
$formcode = "<form action=\"process.php\" method=\"post\" enctype=\"multipart/form-data \">
<label for=\"file\">Filename:</label>
<input type=\"file\" name=\"file\" id=\"file\"/> 
<br />
<input type=\"submit\" name=\"submit\" value=\"Submit\" onclick=\"setTimeout(function() { sendInfo(\"".$blah."\", \"".$test."\"); } ),1250);\" />
</form>";

echo "<h1>hello</h1>
<div id='form'>
<a href='#' onclick=\"popup('" . htmlentities($formcode) . "'); return false;\">
click here</a>
</div>";

Это производит достаточно приличный html-код, однако firebug выдает ошибку, что у меня есть неопределенная боковая строка. Я не могу найти, где это. Я понимаю, что то, как я это сделал, не является идеальным, но я учусь и не знаю лучшего способа в настоящее время. Я ценю любой вклад

edit: ОК, проблема в том, что у меня были неопределенные строковые литералы, которые были \ n символами. Я сделал строку в одну строку, и она правильно вызвала функцию.

Разве нельзя разбить один оператор echo на несколько строк?

Теперь проблема в HTML, генерируемом во всплывающем окне. Часть кода фактически выводится на экран, почему это так?

<form action="process.php" method="post" enctype="multipart/form-data "><label for="file">Filename:</label><input name="file" id="file" type="file"> <br><input name="submit" value="Submit" onclick="setTimeout(function() { sendInfo(" type="submit"><h1>Well</h1>", "<h2>Done</h2>"); },1250);" /></form>

Смотрите изображение здесь :

Ответы [ 4 ]

1 голос
/ 07 мая 2009

Лучший способ сделать это - открыть страницу HTML или PHP, в которой уже есть код формы, вместо открытия about:blank и его динамической передачи.

Нет никакой причины, по которой вам когда-либо приходилось бы передавать HTML в функцию Javascript, просто чтобы он мог быть напрямую записан в документ.

1 голос
/ 07 мая 2009

Если вам абсолютно необходимо сохранить всплывающую функцию как есть, я нашел решение с помощью этого ответа до " Как мне избежать строки внутри javascript внутри обработчика onClick? ».

<?php
$blah = "<h1>Well</h1>"; $test = "<h2>Done</h2>";
echo '<script type="text/javascript" src="fetchlayers.js"></script>';
$formcode = '<form action="process.php" method="post" enctype="multipart/form-data ">
<label for="file">Filename:</label>
<input type="file" name="file" id="file"/> 
<br />
<input type="submit" name="submit" value="Submit" onclick="setTimeout(function() { sendInfo(\\x27'.$blah.'\\x27, \\x27'.$test.'\\x27); }, 1250);" />
</form>';

echo "<h1>hello</h1>
<div id='form'>
<a href='#' onclick='popup(\"" . addslashes(str_replace("\n", ' ', $formcode)) . "\"); return false;'>
click here</a>
</div>";
?>

Перед редактированием:

Может быть, вы можете сделать это по-другому.

Функции JavaScript:

function popup(id, params){
    var html = document.getElementById(id).innerHTML;

    if (params != undefined) {
        html = findAndReplaceStrings(html, params);
    }

    var child1 = window.open ("about:blank");
    child1.document.write(html);
    child1.document.close();
}

function findAndReplaceStrings(text, json) {
    for (var x in json) { 
        text = text.replace(x, json[x]);
    }
    return text;
}

HTML скрытый код:

<div style="display:none;" id="process">
<form action="process.php" method="post" enctype="multipart/form-data ">
<label for="file">Filename:</label>
<input type="file" name="file" id="file"/> 
<br />
<input id="submit" type="submit" name="submit" value="Submit" onclick="setTimeout(function() { sendInfo('{param1}', '{param2}'); } ), 1250);" />
</form>
</div>

HTML-ссылка с json:

<a href="#" onclick="popup('process', {'{param1}':'<h1>Well</h1>', '{param2}':'<h2>Done</h2>'}); return false;">
click here</a>
0 голосов
/ 07 мая 2009

Кнопка отправки имеет дополнительный ), который слишком рано закрывает функцию setTimeout. Конкретное место внутри:

} ),1250

Вам также следует подумать об использовании одинарных кавычек внутри строки php, чтобы все было проще читать. А поскольку вы используете двойные кавычки, вам не нужно вставлять строку, чтобы вставить содержимое переменных $ blah и $ test.

примерно так должно работать:

$formcode = "...
<input type='submit' name='submit' value='Submit' 
onclick='setTimeout(function() { sendInfo(\"$blah\", \"$test\"); },1250);' />
...

";

EDIT:

похоже, он слишком рано закрывает клик. Сопоставляя их как начальные и конечные кавычки:

onclick=\"setTimeout(function() { sendInfo(\"

Я изменил строку sendInfo на следующую, запустил ее и, похоже, она работает. Единственная кавычка здесь исключается, поэтому она не закрывает преждевременно вызов popup ().

sendInfo(\'".$blah."\', \'".$test."\');
0 голосов
/ 07 мая 2009

Вы должны избежать возврата каретки (\ n), выполнив

$formcode = str_replace("\n", "\\n", $formcode);

Вы также должны избежать кавычек

$formcode = str_replace("'", "\\'", $formcode);

Вы можете объединить эти две строки в одну:

$formcode = str_replace(array("\n", "'"), array("\\n", "\\'"), $formcode);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...