У меня есть две функции: один получает URL-адрес в определенном формате (например, «test.com?action=query & max_results = 20») и разбивает его на динамически генерируемые текстовые поля для редактирования. Другой ставит его вместе вместе с любыми изменениями. Обе функции вызываются нажатием кнопки.Невозможно найти динамически сгенерированные текстовые поля
Вторая функция не может найти идентификаторы динамически генерируемых текстовых полей - они возвращаются как «null». Как получить функцию для распознавания идентификаторов, созданных после загрузки страницы?
Код:
<script>
function Split()
{
//Get table body for insert
var table = document.getElementById("ValueTableBody");
//Clear table of rows
table.innerHTML = '';
//Grab URL
var URLquery = document.getElementById("oldquery").value;
//Split on ? to isolate query
var querysplit = oldquery.split("?");
//Store main url
var mainURL = document.getElementById('mainURL');
mainURL.value=querysplit[0];
//Split on & to isolate variables
var splitagain = querysplit[1].split("&");
var i = 0;
//Loop on number of variables in query
for(i = 0; i < splitagain.length; i++){
//Split on = to isolate variables and values
var splitthird = splitagain[i].split("=");
//Insert new row into table
var row = table.insertRow(i);
row.insertCell(0).innerHTML = '<input type="text" id="query' + i + '"/>';
row.insertCell(1).innerHTML = '<input size="50" type="text" id="queryvalue' + i + '"/>';
//Insert variable and value into respective inputs.
var split1 = document.getElementById('query' + i);
split1.value=splitthird[0];
var split2 = document.getElementById('queryvalue' + i);
split2.value=splitthird[1];
}
}
function Unsplit()
{
var mainURL = document.getElementById('mainURL').value;
var completequery = [];
var URLarray = [];
var rowCount = document.getElementById('ValueTableBody').rows.length;
for(i = 0; i <= rowCount; i++){
//Get variable of current row
var value1 = document.getElementById('query' + i).value;
//Get value of current row
var value2 = document.getElementById('queryvalue' + i).value;
if (value1) {
if (value2) {
//If both have value, then push into array
valueArray = [];
valueArray.push(value1);
valueArray.push(value2);
//Merge into one to push into next array
var newvalue = valueArray.join("=");
URLarray.push(newvalue);
}
}
}
//Join all sections of the query together
mergearray = URLarray.join("&");
//Push mainURL
completequery.push(mainURL);
//Push completed query
completequery.push(mergearray);
//Join the query together to make complete new URL
mergearray2 = completequery.join("?");
//Display new URL
var newquery = document.getElementById('newquery');
newquery.value=mergearray2;
//Output new URL to iframe
document.getElementById('webservicedisplay').src = mergearray2;
}
</script>
HTML:
<div style="float:left;">
<h1>Webservice Tester</h1>
<p><label style="font-weight:bold; display:inline-block; vertical-align:top;">Old Webservice Call:</label> <textarea cols="60" rows="4" id="oldquery"></textarea></p>
<input type="submit" name="button" id="splitbutton" onclick="Split()" value="Split!" /> <br><br>
<p><label style="font-weight:bold;">URL:</label> <input type="text" size="50" id="mainURL"></input></p><br>
<table id="ValueTable">
<thead>
<th>Variable</th>
<th>Value</th>
</thead>
<tbody id="ValueTableBody">
</tbody>
</table>
<br>
<p><input type="submit" name="button" id="unsplit" onclick="Unsplit()" value="Unsplit!" /></p> <br><br>
<p><label style="font-weight:bold; vertical-align:top;">New Webservice Call:</label> <textarea cols="60" rows="4" id="newquery"></textarea></p>
</div>
<div style="float:left; padding-left:20px;">
<p><label style="font-weight:bold;">Output:</label></p><br>
<iframe height="450" width="500" id="webservicedisplay" src="">
</iframe>
Это не поможет, к сожалению, - вопрос с второй функции, где я пытаюсь для получения значения текстовых полей, которые генерируются первой функцией. Удельные линии, имеющие проблемы: // Получить переменную текущей строки var value1 = document.getElementById ('query' + i) .value; // Получить значение текущей строки var value2 = document.getElementById ('queryvalue' + i) .value; – Amy
Вы уверены? Работает на меня. Вот тест: http://jsfiddle.net/mc7axx0k/ Вы не сможете получить значение элемента DOM, пока он не станет доступен в DOM. Таким образом, вам нужно либо подождать с помощью 'setTimeout', либо вызвать его после другого действия пользователя. Попробуйте добавить точку останова или предупреждение перед тем, как получить значение. Надеюсь, это поможет. – Scott
Ах, исправил! Проблема была фактически в цикле с условием «<=» - он искал еще одну строку таблицы, которая не существовала. Все остальное велось с самого начала. – Amy