Я новичок в JavaScript и в настоящее время пытаюсь заставить переменные внутри функции работать вне ее и в настоящее время столкнулся со стеной, где я не могу заставить ее работать.
Сценарий заключается в том, что я хочу изменить URL-адрес через раскрывающуюся форму, используя комбинацию Javascript и HTML. Если я помещу оператор if else внутри функции, он будет работать безупречно, но в моем сценарии мне нужно поместить его вне функции, и он не работает даже после того, как я сделал переменную глобальной.
Я пробовал несколько решений из вопросов, связанных с моей проблемой, но, похоже, это не работает для моего сценария.
Вот код, который я сейчас использую.
var documentLink = document.getElementById('documentLink');
function getDocument(option) {
chosenDocument = option.value;
}
if (chosenDocument === "Google") {
documentLink.href = "https://www.google.com";
} else if (chosenDocument === "duckduckgo") {
documentLink.href = "https://www.duckduckgo.com";
}
5 ответов
Это, вероятно, то, что вы хотели сделать.
Примечание. Я использую рекомендуемые eventListeners.
window.addEventListener("DOMContentLoaded", function() { // when elements are available in page
const documentLink = document.getElementById('documentLink');
document.getElementById("searchSites").addEventListener("change", function() {
const chosenSite = this.value;
if (chosenSite === "Google") { // this could be done nicer with a lookup table
documentLink.href = "https://www.google.com";
} else if (chosenSite === "duckduckgo") {
documentLink.href = "https://www.duckduckgo.com";
}
})
documentLink.addEventListener("click", function(e) {
if (this.getAttribute("href") === "") { // not set
e.preventDefault(); // stop link
alert("Please select a site first");
}
})
})
<select id="searchSites">
<option value="">Please select</option>
<option value="Google">Google</option>
<option value="duckduckgo">duckduckgo</option>
</select><br/>
<a href="" id="documentLink">GO</a>
load
неуместно, поскольку потенциально оно может произойти через минут после полной загрузки HTML. Вместо этого используйте событие DOMContentLoaded
, которое является фактической точкой, в которой getElementById
и querySelector
можно безопасно использовать.
Когда вы помещаете свои коды непосредственно в тело тега «script», он будет выполняться только один раз (при загрузке скрипта). Вам нужно поместить свои коды в место, которое может запускаться более одного раза, например, поместить его в функцию и вызывать ее при возникновении события.
Если вам нужно, чтобы блок «если» запускался каждый раз, когда изменяется раскрывающееся значение, у вас есть следующие варианты: 1- переместите свой код в функцию getDocument 2- переместите блок «если» в новую функцию, а затем вызовите его в функции getDocument.
Или 3- переместите свой блок «если» в новую функцию, а затем назначьте его другому событию, совпадающему с событием выпадающего списка (например, выпадающее меню при изменении или выпадающее меню при размытии)
- Оберните код для выполнения в событии DOMContentLoaded.
- Переместите функцию getDocument за пределы этого прослушивателя событий.
- Я предполагаю, что у вас уже есть прослушиватель событий выбора опции, и у вас есть переменная с именем SelectOption с выбранным значением
Вы можете попробовать следующий код:
<script>
// Function extracts and returns value from provided parameter
function getDocumentValue(option) {
return option.value;
}
window.addEventListener('DOMContentLoaded', () => {
const documentLink = document.getElementById('documentLink'); // Id is fine if we are sure it wont be duplicated.
const chosenDocument = getDocumentValue(SelectOption);
if (chosenDocument === "Google" ) {
documentLink.href = "https://www.google.com";
} else if (chosenDocument === "duckduckgo") {
documentLink.href = "https://www.duckduckgo.com";
}
})
</script>
В комментариях под вашим вопросом изложены ключевые проблемы. Я просто хотел быстро добавить альтернативный подход, который, поскольку вы только начинаете работать с JS, может показаться вам интересным.
// Select the element
const select = document.querySelector('select');
// Add an event listener to it to watch out for changes
// and when that listener is fired call the handleChange function
select.addEventListener('change', handleChange, false);
// Here is an object containing routes
// The keys map directly to the values of the options
const routes = {
google: 'https://www.google.com',
duckduckgo: 'https://www.duckduckgo.com'
}
// So that when the function is called all
// we need to do is get the value of that particular route
function handleChange() {
console.log(routes[this.value]);
}
<select>
<option disabled selected>Choose</option>
<option value="google">Google</option>
<option value="duckduckgo">duckduckgo</option>
</select>
Дополнительная документация
Ваша проблема связана с областями действия. Объявите переменную снаружи, чтобы она находилась в области окна, а не в области функции:
var documentLink = document.getElementById('documentLink');
var chosenDocument;
function getDocument(option) {
chosenDocument = option.value;
}
if (chosenDocument === "Google" ) {
documentLink.href = "https://www.google.com";
} else if (chosenDocument === "duckduckgo") {
documentLink.href = "https://www.duckduckgo.com";
}
В качестве альтернативы вы можете изменить свою функцию, чтобы она возвращала значение (ее название указывает на то, что она что-то возвращает):
var documentLink = document.getElementById('documentLink');
function getDocument(option) {
return option.value;
}
if (getDocument() === "Google" ) {
documentLink.href = "https://www.google.com";
} else if (getDocument() === "duckduckgo") {
documentLink.href = "https://www.duckduckgo.com";
}
chosenDocument
не объявлен в getDocument()
, поэтому он не относится к этой функции. Кроме того, учитывая, что getDocument()
не вызывается до обращения к chosenDocument
, оно все равно не будет содержать ожидаемое значение.
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.
getDocument
, поэтомуchosenDocument
никогда не будет установлено.getElementById
(ниquerySelector
) до событияDOMContentLoaded
, иначе они не будут работать надежно.chosenDocument === "Google"
, иначе оно не будет иметь правильного значения.