Я испортил свой код довольно сильно, поэтому мне нужна помощь.
Я получаю следующую ошибку:
SyntaxError: ожидаемое выражение, конец сценария
Ошибка, кажется, говорит мне о том, что у меня есть либо скобка, либо точка с запятой, и из-за сумасшедшего характера сегодня я просто не могу ее найти. Я пытался сделать свой Javascript менее навязчивым, переместив функцию прослушивания событий под window.onload
обработчик функции внутри UserInterface.js; однако мне нужно было передать массив «Fields» между PHP и событием onload, поэтому я хочу сохранить событие onload в:
<body onload="OnLoad('.$EncodedFields . ');">';
, если кто-то не может сказать мне лучший способ передать эту переменную.
Каким-то образом в моем вмешательстве я вызвал эту ошибку. Кто-нибудь знает, как исправить эту ошибку? И как я должен правильно передать переменную php в Javascript для использования в событии onload?
UserInterface.php
class UserInterface {
var $ParentAppInstance;
function __construct($AppInstance){
$this->ParentAppInstance = $AppInstance;
$this->DrawPageHTML();
$this->DrawDBSetDropdown();
$this->DrawQueryForm();
}//Override thjis function to change the HTML and PHP of the UI page.
protected function DrawPageHTML(){
$DBSet_Num = filter_var($this->ParentAppInstance->CurrentDBSet_Str, FILTER_SANITIZE_NUMBER_INT);
$CurrDBSet_Obj = $this->ParentAppInstance->DBSets_Arr[$DBSet_Num];
$EncodedFields = json_encode($CurrDBSet_Obj->GetDBSetFields());
echo '<body onload="OnLoad('. $EncodedFields .');">';
echo '
<div id="DebugOutput"></div>
</body>';
//json_encode($CurrDBSet_Obj->GetDBSetFields())
echo '$AppInstanceData: ' . '<br>';
echo '--CurrentDBSet_Str: ' . $this->ParentAppInstance->CurrentDBSet_Str;
}
protected function DrawDBSetDropdown(){
echo '<div align="right">';
echo '<select onchange="SwitchDatabaseSet();" name="DBSetList" form="DBSetSelector" id="DBSetSelector">';
$i = 0;
foreach ($this->ParentAppInstance->DBSets_Arr as $DBSet){
if ($DBSet->DBSetName == $this->ParentAppInstance->CurrentDBSet_Str){
echo '<option value="' . $DBSet->DBSetName . '">' . $DBSet->DBSetName . '</option>';
}
}
foreach ($this->ParentAppInstance->DBSets_Arr as $DBSet){
if ($DBSet->DBSetName == $this->ParentAppInstance->CurrentDBSet_Str){/* DO NOTHING. IE. IGNORE IT*/}
else if ($DBSet->DBSetName == 'DBSet0'){/* DO NOTHING. IE. IGNORE IT*/}
else{
//Add the DBSet to the dropdown list.
$i++;
echo '<option value="' . $DBSet->DBSetName . '">' . $DBSet->DBSetName . '</option>';
}
}
echo '</select>';
echo '</div>';
}
protected function DrawQueryForm(){
echo '<form action="search.php" method="post">';
echo '<div id="QFormBody">';
$NumActiveQBoxes = $this->ParentAppInstance->Config['ApplicationSettings']['NumberDefaultQueryOptions'];
for ($i = 0; $i < $NumActiveQBoxes; $i++){
echo '<div class="QueryBox" name="QBox_' . $i . '">';
echo '<select name=Field_' . $i . '">';
$DBSet_Num = filter_var($this->ParentAppInstance->CurrentDBSet_Str, FILTER_SANITIZE_NUMBER_INT);
$CurrDBSet_Obj = $this->ParentAppInstance->DBSets_Arr[$DBSet_Num];
foreach($CurrDBSet_Obj->GetDBSetFields() as $Field){
echo '<option>' . $Field . '</option>';
}
echo '</select>';
echo '<input type="text"></input>';
echo '<button class= "RMButton" type="button">-</button>';
echo '</div>';
}
echo '<button type="button" id="add" onclick="AddQueryBox();">+</button>';
echo '<button type="submit" id="submit">SEARCH</button>';
echo '</Form>';
$EncodedFields = json_encode($CurrDBSet_Obj->GetDBSetFields());
echo '<script src=/GLS_DBSearchProject/JavaScript/UserInterface.js></script>';
}
}
UserInterface.js
var DBSetFields = [];
var NumQBoxes = 3;
function OnLoad(Fields){
console.log("Alpha");
console.log(Fields);
CloneDBSetFields(Fields);
var RMNodeList = document.getElementsByClassName('RMButton');
for (var i = 0; i < RMNodeList.length; ++i) {
console.log(RMNodeList[i]);
RMNodeList[i].onclick = RemoveQBox; // Calling myNodeList.item(i) isn't necessary in JavaScript
}
}
function Fields_FOREACH(ELEMENT, INDEX, ARRAY){
var FieldOption = document.createElement('option');
FieldOption.setAttribute('value', ARRAY[INDEX]);
FieldOption.innerHTML = ARRAY[INDEX];
this.appendChild(FieldOption);
}
function CloneDBSetFields(Fields){
console.log("CloneDBSetFields");
DBSetFields = Fields;}
function AddQueryBox(){
NumQBoxes += 1;
var NewQBox = document.createElement('div');
NewQBox.setAttribute('class', 'QueryBox');
//Create and fill Field Selector dropdown "select" element
var FieldSelector = document.createElement('select');
FieldSelector.setAttribute('name', 'Field_' + NumQBoxes);
//foreach element in Fields
console.log(DBSetFields);
DBSetFields.forEach(Fields_FOREACH, FieldSelector);
//Create and fill
var QueryText = document.createElement('input');
QueryText.setAttribute('type', 'text');
QueryText.setAttribute('name', 'Query_' + NumQBoxes);
//Create "-" Remove button for removing query lines.
var RemoveButton = document.createElement('button');
RemoveButton.innerHTML = "-";
RemoveButton.setAttribute('type', 'button');
RemoveButton.setAttribute('class', 'RMButton');
RemoveButton.addEventListener("click", RemoveQBox);
//Combine the individual elements into a new query box and insert the new query box into the HTML Document
NewQBox.appendChild(FieldSelector);
NewQBox.appendChild(QueryText);
NewQBox.appendChild(RemoveButton);
document.getElementById("QFormBody").insertBefore(NewQBox, document.getElementById("add"));
}
function RemoveQBox(e){
console.log("Remove");
var RemoveButton = this; //this == e.currentTarget
console.log(RemoveButton);
var QBox = RemoveButton.parentNode;
QBox.remove();
NumQBoxes -= 1;
}
Так видимо
body onload = «OnLoad (‘. $ EncodedFields.’);»
Является ли это на самом деле причиной проблемы. По какой-то причине я не совсем понял, почему оператор конкатенации php в этом случае не работает.
Изменение этой строки на body onload="OnLoad{$EncodedFields};"
или замена одинарных и двойных кавычек (при удалении периодов) также исправили это.
Других решений пока нет …