Подтвердить что ты не робот

JavaScript не работает на jsfiddle.net

Нижеприведенный код работает на реальном сайте, но я не могу его запустить на сайте jsfiddle.

См. этот.

Может ли кто-нибудь сказать мне, почему он не работает на jsfiddle?

На консоли он записывает: ReferenceError: fillList is not defined и ReferenceError: mySelectList is not defined.

Код работает так, как вы можете видеть, когда он встроен здесь как фрагмент:

function BetterSelect(oSelList) {
  this.objSelectList = oSelList;
  this.objSelectList.onchange = this.selectionChanged;
}
BetterSelect.prototype.clear = function() {
  this.objSelectList.options.length = 0;
}
BetterSelect.prototype.fill = function(aValues) {
  this.clear();
  for (var i = 0; i < aValues.length; i++) {
    this.objSelectList.options[i] = new Option(aValues[i]);
  }
}
BetterSelect.prototype.find = function(strToFind, bSelect) {
  var indx = -1;
  this.objSelectList.options.selectedIndex = -1;
  for (var i = 0; i < this.getCount(); i++) {
    if (this.objSelectList.options[i].text == strToFind) {
      indx = i;
      if (bSelect)
        this.objSelectList.options.selectedIndex = i;
    }
  }
  return indx;
}
BetterSelect.prototype.getCount = function() {
  return this.objSelectList.options.length;
}
BetterSelect.prototype.selectionChanged = function() {
  alert("selection changed!");
}

var mySelectList = null;
window.onload = function() {
  mySelectList = new BetterSelect(document.getElementById('theList'));
}

function fillList() {
  mySelectList.fill(["one", "two", "three", "four", "five"]);
}

function findIt() {
  mySelectList.find(document.getElementById('txtToFind').value, true);
}
<form action="" method="post">
  <select multiple="multiple" name="Select1" id="theList" style="width: 152px; height: 226px">
  </select>
  <br />
  <input name="Button1" type="button" value="Fill The List" onclick="fillList()" />
  <input name="Button4" onclick="mySelectList.clear()" type="button" value="Clear The List" />
  <br />
  <input name="Button2" onclick="alert(mySelectList.getCount())" type="button" value="What The Count?" />
  <br />
  <input name="Text1" type="text" id="txtToFind" />
  <input name="Button3" type="button" value="Search" onclick="findIt()" />
</form>
4b9b3361

Ответ 1

Определяемые вами функции определяются в функции onload, поэтому, прежде чем они будут ссылочными, поскольку они определены в этой функции, на них можно ссылаться только внутри этой функции. Вы ссылаетесь на них как на глобальные переменные в своем HTML. У вас есть три варианта

a) (самый простой, быстрый, не идеальный) - измените function blah(){} на window.blah = function(){};, сделав функции глобальными.

b) (идеальный способ) - используйте ненавязчивый Javascript для присоединения поведения к элементам DOM из JS исключительно, что означает отдельный HTML из JS.

c) Сделать jsfiddle не переносом материала на загрузку. Измените onLoad на отсутствие обертывания (тела или головы).

Итак, вместо <p onclick="lol()" id="foo"> вы делаете var e = document.getElementById('foo'); e.onclick = lol; только в JS.

Я рекомендую b, поскольку он поощряет лучшие практики.

Ответ 2

В своей скрипте выберите no wrap (head) в раскрывающемся списке слева, нажмите "Выполнить", и он будет работать.

See example →

При выборе onLoad ваши функции определяются только в закрытии $(document).ready(function() {});.

Ответ 3

Я нашел ту же проблему и разрешил ее, изменив Load Type в настройках JavaScript:

No wrap-in<head> или No wrap-in<body> в раскрывающемся меню настроек JavaScript. См. Изображение ниже.

Меню настроек JavaScript

Ответ 4

Посмотрите:

fooobar.com/info/816/...

Или лучше увидеть это:

fooobar.com/info/816/...

Вот что я тестировал:

function testJSON() { 
    var jsonString = '{"param1":"123","param2":"XXX78","param3":"11378"}'; 
    var tmp_obj = eval('(' + jsonString + ')');
    document.getElementById("result").innerHTML =  tmp_obj.param2;
}

и

function testJSON() { 
    var jsonString = '{"param1":"123","param2":"XXX78","param3":"11378"}'; 
    var tmp_obj = JSON.parse(jsonString);
    document.getElementById("result").innerHTML =  tmp_obj.param2;
} 

Лучше использовать второй aproach.

P.S. > Я пришел из Как анализировать параметры из JSON String с помощью JS?