Javascript Code работает в jsfiddle, но не в браузере
Я пытался найти похожие проблемы, но не смог найти причину, по которой мой код работает в jfiddle, а не в браузере. Я также попытался сделать копию своего кода из jfiddle в другой проект скрипта, и код не работает в новом проекте. Вы можете найти мой проект здесь. Я делаю интерактивную игру о еде, в которой кто-то выбирает продукт, например, желудевую тыкву, а затем пользователь может перетаскивать это изображение.
Моя первая попытка была вставить код в голову.
<script language="JavaScript">
code
</script>
Нужно ли мне событие загрузки страницы? Должен ли JavaScript быть включен в функцию? Я использую что-то из фреймворка jfiddle, которое не используется на моем локальном хосте, которое мне нужно вызвать?
Ниже приведен код, который я использую без дополнительных вариантов питания
var stage, layer;
var sources = {
plate: 'http://www.healncure.com/wp-content/uploads/2014/03/plate1.jpg',
acornsquash: 'http://www.healncure.com/wp-content/uploads/2014/03/acorn-squash.png',
};
loadImages(sources, initStage);
function loadImages(sources, callback) {
var images = {};
var loadedImages = 0;
var numImages = 0;
// get num of sources
for (var src in sources) {
numImages++;
}
for (var src in sources) {
images[src] = new Image();
images[src].onload = function () {
if (++loadedImages >= numImages) {
callback(images);
}
};
images[src].src = sources[src];
}
}
function initStage(images) {
stage = new Kinetic.Stage({
container: 'container',
width: 936,
height: 550
});
layer = new Kinetic.Layer();
stage.add(layer);
// plate
var plateImg = new Kinetic.Image({
image: images.plate,
x: 218,
y: 20,
width: 503,
hei4ht: 502,
draggable: false,
visible: true
});
layer.add(plateImg);
// acornsquash
var acornsquashImg = new Kinetic.Image({
id: "acornsquash",
image: images.acornsquash,
x: 50,
y: 20,
width: 134,
height: 114,
draggable: true,
stroke: 'orange',
strokeWidth: 5,
strokeEnabled: false,
visible: false
});
layer.add(acornsquashImg);
layer.draw();
$(".food").click(function () {
var node = stage.find("#" + $(this).attr("id"));
node.show();
layer.draw();
console.log($(this).attr("id"));
});
document.getElementById('hide').addEventListener('click', function () {
acornsquashImg.hide();
layer.draw();
}, false);
}
2 ответа
Обычная причина этого заключается в том, что вы размещаете свой код над элементами, над которыми он работает, а не задерживаете код, используя onload
или "готовые" события. По умолчанию jsFiddle ставит ваш JavaScript в onload
обработчик, который задерживает его очень поздно в процессе загрузки страницы.
По сути, прежде чем ваш код сможет что-то сделать с элементом на странице, элемент должен существовать. Чтобы он существовал, браузер должен обработать для него HTML-код. Так что это не удается:
<html>
<head>
<script>
// FAILS
document.getElementById("foo").style.color = "green";
</script>
</head>
<body>
<div id="foo">This is foo</div>
</body>
</html>
но это работает:
<html>
<head>
</head>
<body>
<div id="foo">This is foo</div>
<script>
// Works
document.getElementById("foo").style.color = "green";
</script>
</body>
</html>
Нужно ли мне событие загрузки страницы?
Почти наверняка нет.
Должен ли JavaScript быть включен в функцию?
Не обязательно. Что вы делаете, это положить script
тег в самом конце HTML, перед закрытием </body>
тег.
Включите библиотеку jQuery в заголовочный раздел вашего документа
<head>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
</head>
затем оберните ваши собственные сценарии между тегами сценария и функцией готовности документа
<script>
$(function() {
...your custom scripts...
});
</script>
как раз перед </body>
тег.