以下代码适用于实际网站,但我无法在网站jsfiddle上运行。
例如,请参阅this。
有谁可以告诉我为什么它不能用于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's The Count?" />
<br />
<input name="Text1" type="text" id="txtToFind" />
<input name="Button3" type="button" value="Search" onclick="findIt()" />
</form>
答案 0 :(得分:90)
您定义的函数在onload函数中定义,因此在它们可引用之前,因为它们是在该函数中定义的,所以它们只能在该函数中引用。您可以在HTML中将它们作为全局变量引用。你有三个选择
a)(最简单,最快捷,不理想) - 将function blah(){}
更改为window.blah = function(){};
,使函数全局化。
b)(理想方式) - 使用不显眼的Javascript将行为附加到JS内部的DOM元素,这意味着单独的HTML与JS。
c)让jsfiddle不包装东西onload。将onLoad
改为无包裹(正文或头部)。
所以不是<p onclick="lol()" id="foo">
而是只在JS中做var e = document.getElementById('foo'); e.onclick = lol;
。
我推荐b,因为它鼓励最佳实践。
答案 1 :(得分:48)
在你的小提琴中选择左侧下拉列表中的no wrap (head)
,点击“运行”,它将起作用。
选择onLoad
后,您的功能仅在$(document).ready(function() {});
的封闭内定义。
答案 2 :(得分:5)
我发现了同样的问题并通过更改JavaScript设置中的Load Type
解决了这个问题:
No wrap-in<head>
或No wrap-in<body>
。请参阅下图。
答案 3 :(得分:0)
看看:
https://stackoverflow.com/a/4935684/6796393
或者最好看一下这个:
https://stackoverflow.com/a/19110630/6796393
以下是我测试的内容:
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;
}
最好使用第二种方法。
P.S.&GT;我来自How to parse parameters from JSON String using JS?