Вход

Просмотр полной версии : Не срабатывают события из HTML


devastor
09.09.2014, 18:54
Добрый день, у меня такая проблема:
события срабатывают из JS:
document.getElementById('start').onclick = function (){
//код
},
но не срабатывают из HTML

function clear(){
//код
}


<input type="text" onKeyDown="clear()" size="20" id="start">

В чем может быть проблема?

Pavel M.
09.09.2014, 19:36
можно использовать onkeydown="window.clear()" либо поменяйте имя функции

Safort
09.09.2014, 20:46
devastor,
покажи полный код или хотя бы ошибки.

bes
09.09.2014, 21:34
тест

<script>
function clear(){
console.log("test 1:");
console.log(document.clear === clear); console.log(window.clear === clear);
}
clear();
</script>​
<button onclick="console.log('test 2:'); console.log(document.clear === clear); console.log(window.clear === clear);">click</button>

devastor
10.09.2014, 07:53
Полный код JS

<script src="//api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
ymaps.ready(init);
function clear(){
console.log("test 1:");
console.log(document.clean === clean); console.log(window.clean === clean);
myCollection.removeAll();
geolocation.get({
provider: 'yandex',
mapStateAutoApply: true
}).then(function (result) {
result.geoObjects.get(0).properties.set({});
myMap.geoObjects.add(result.geoObjects);
});
clear();
}
function init() {
//создаём карту
var geolocation = ymaps.geolocation,
myMap = new ymaps.Map('map', {
center: [54.724403, 55.970748],
zoom: 10,
controls: []
});
var myCollection = new ymaps.GeoObjectCollection();
//отключение движения карты и масштабирования
myMap.behaviors.disable(['drag','rightMouseButtonMagnifier', 'scrollZoom', 'dblClickZoom', 'multiTouch']);
document.getElementById('load').onclick = function () {
if (document.getElementById('start').value != null){
//Строим Маршрут, по точкам, с учётом пробок
var start = document.getElementById('start').value;
var finish = document.getElementById('finish').value;
ymaps.route([start, finish], {avoidTrafficJams: true, mapStateAutoApply: true}).then(
function (route) {
myCollection.add(route);
myMap.geoObjects.add(myCollection);
document.getElementById('city').value = (route.getLength()/1000).toFixed(1) + ' километров';
document.getElementById('timenone').value = timeformat(route.getTime());
document.getElementById('timeprob').value = timeformat(route.getJamsTime());
document.getElementById('price').value = price((route.getLength()/1000).toFixed(1)) + ' руб';
},
function (error) {
if(error.message == "can't construct a route") {
alert("При построении маршрута возникла ошибка.\r\nПопробуйте изменить адреса или перезагрузить страницу.");
} else {
alert("Возникла ошибка: " + error.message);
}
}
);
}
}
//функция расчета стоимости
function price(length){
var price = 30 + (length * 12);
if (price < 100) { price = 100;}
return price.toFixed(0);
}
//функция правильного вывода часов и минут
function timeformat(time){
var twotime = time = time /60;
if (time >= 60){
time = Math.floor(time / 60);
var minuts = twotime - (time * 60);
var hour;
switch (true) {

case time == 1:
hour = ' час';
break

case time >= 2 && time < 5:
hour = ' часа';
break

case time > 5:
hour = ' часов';
break

default:
hour = ' час';
break

}
minuts = minutstime(minuts);
return time + hour +' '+ minuts;
}
return minutstime(twotime);
}
// вспомогательная функция для правильного вывода минут
function minutstime(minuts){
minuts = minuts.toFixed(0);
var timemin;
switch (true) {

case minuts == 1:
timemin = minuts + ' минута';
break

case timemin >= 2 && timemin < 5:
timemin = minuts + ' минуты';
break

case timemin > 5:
timemin = minuts + ' минут';
break

default:
timemin = minuts + ' минут';
break

}
return(timemin);
}
};
И HTML
<body style="padding:0px; margin:0px; height:2000px;">
<div id="map" style="width: 100%; position: absolute; height: 70%; padding:0px; margin:0px; z-index:1;"></div>
<div style="padding:10px; position: absolute; z-index:2; background:#FFF; margin:30px 25% 0 0; opacity:.8;">
<form method="post" action="javascript:insert()">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td>Начало:</td>
<td><input type="text" onkeydown="window.clear()" size="20" id="start" value="Алкино-2" ></td>
</tr>
<tr>
<td>Финиш:</td>
<td><input type="text" onkeydown="window.clear()" size="20" id="finish" value="Уфа, Путейская 1Б" ></td>
</tr>
<tr></tr>
<tr>
<td>Расстояние:</td>
<td><input type="text" size="20" id="city" ></td>
</tr>
<tr>
<td>Время без учета пробок:</td>
<td><input type="text" size="20" id="timenone"></td>
</tr>
<tr>
<td>Время с учетом пробок:</td>
<td><input type="text" size="20" id="timeprob"></td>
</tr>
<tr>
<td>Стоимость:</td>
<td><input type="text" size="20" id="price"></td>
</tr>
<tr>
<INPUT TYPE="SUBMIT" VALUE ="Принять заказ"></form>
<button id="load">Расчитать</button>
<button onclick="return location.href = 'http://test.devastor.ru/taxi/zakaz.php'" > ЗАКАЗЫ</button>
<button onclick="console.log('test 2:'); console.log(document.clean === clean); console.log(window.clean === clean);">click</button>
</tr>
</table>




</div>
</body>
На JS пишу второй день, так что сильно палками прошу не бить :)
При этом console.log("test 1:"); не срабатывает однозначно даже при явном вызове ниже

devastor
10.09.2014, 08:23
Если делаю document.clear(), либо просто clear(), то ошибок не выдаёт, но и не срабатывает, если делаю window.clear то выдаёт ошибку
TypeError: window.clear is not a function

devastor
10.09.2014, 13:57
Решил перевызовом функции, всем спасибо!

Safort
10.09.2014, 21:37
devastor,
каким ещё перевызовом?
Несколько замечаний:
1. В конце функции clear() она вызывает сама себя без всякого условия, а это не хорошо. Да и зачем?
2. Когда я смотрел код, то увидел, что переменные myCollection и geolocation у тебя локальные, и определяются в одних функциях, а используются в других. Это должно приводить к ошибкам.
3. Функции insert() нет в коде, следовательно будет ошибка при отправке.

bes
10.09.2014, 21:50
Если делаю document.clear(), либо просто clear(), то ошибок не выдаёт, но и не срабатывает
с чего бы ему срабатывать (со смыслом, которым он наделялся раньше), он больше не поддерживается - он остался, но do nothing



<button onclick="console.log('test 2:'); console.log(document.clean === clean); console.log(window.clean === clean);">click</button>


откуда у тебя там clean вообще затесался и что ты хочешь этим проверить?

может уже подумать об этом (http://javascript.ru/forum/site/49174-zachem-ts-dolzhen-sdelat-testovyjj-primer-s-vozmozhnostyu-zapuska.html)?

devastor
12.09.2014, 15:53
А есть возможность использования примерно следующего

//данный код не рабочий и служит для показания, того что необходимо
((document.getElementById('id1').[событие]) ||(document.getElementById('id2').[событие])) = function(){
//тело
}

Т.е что бы одну функцию можно было вызвать событиями нескольких элементов не прибегая к
<input type="text" [событие]="[имя]">