#javascript #onclick
#javascript #onclick
Вопрос:
впервые публикую здесь, но, бог знает, я постоянно использую этот сайт для поиска проблем: P Что ж, теперь у меня возникла собственная проблема, поскольку я, похоже, не могу легко разобраться с поиском в Google, и, поиграв с ним около 2 часов, я, наконец, решилчтобы опубликовать вопрос и посмотреть, что вы, ребята, думаете.
Чего я пытаюсь добиться здесь, так это иметь кнопку, которая появляется над div при наведении на нее курсора мыши, при нажатии на которую открывается панель редактирования. Кнопка отображается над div правильно, но по какой-то причине я не могу заставить функцию onclick работать, чтобы спасти мою жизнь, лол. Вот код, с которым я работаю. Если этого недостаточно, пожалуйста, дайте мне знать, и я добавлю еще немного соуса. 😛
function place_widget(name, properties){
//bbox
var pleft = properties[0];
var ptop = properties[1];
var width = properties[2];
var height = properties[3];
var pright = pleft width;
var pbottom = pleft height;
var bbox = [pleft, ptop, pright, pbottom];
boxes[name] = bbox;
//ID's
var id = 'widget_' name;
var editspanid = id "_editspan";
var editbuttonid = id "_editbutton";
var editpaneid = id "_editpane";
//Creating Elements
var div = "<div id='" id "' class='widget' onmouseover='widget_hover(event);' onmouseout='widget_out(event);'>";
var editbutton = "<a id='" editbuttonid "' href='#'><img onclick='toggleEdit;' src='../images/edit_button.png'></a>";
var editspan = "<span id='" editspanid "' class='editspan'>" editbutton "</span>";
var editpane = "<span id='" editpaneid "' class='editpane'>:)</span>";
div = editspan editpane "</div>";
body.innerHTML = div;
//Configuring Elements
var editspanelement = document.getElementById(editspanid);
var editbuttonelement = document.getElementById(editbuttonid);
editbuttonelement.onclick = alert; //Does nothing.
var editpaneelement = document.getElementById(editpaneid);
var mainelement = document.getElementById('widget_' name);
mainelement.style.left = (pleft leftmost) "px";
mainelement.style.top = (ptop topmost) "px";
mainelement.style.width = width;
mainelement.style.height = height;
getContentsAJAX(name);
}
Извините за уродливый код: P У кого-нибудь есть идеи, почему функция onclick не работает?
Кроме того, немного дополнительной информации: если я открою firebug и вставлю :
document.getElementById('widget_Text_01_editbutton').onclick = alert;
Когда я нажимаю на кнопку, я получаю:
uncaught exception: [Exception... "Illegal operation on WrappedNative prototype object" nsresult: "0x8057000c (NS_ERROR_XPC_BAD_OP_ON_WN_PROTO)" location: "native frame :: <unknown filename> :: <TOP_LEVEL> :: line 0" data: no]
Я не совсем уверен, что это означает.
Спасибо!
Комментарии:
1. Общий комментарий относительно публикации кода JS / HTML: хотя некоторые люди иногда могут просто посмотреть на код и обнаружить некоторые ошибки, другим было бы полезно помочь вам, если бы вы сделали его более доступным, либо 1) разместив что-то целое, что можно просто скопировать в файл и открыть в браузереи / или 2) включение jsfiddle.net .
2. Да. Я обязательно подумаю об этом в будущем. Спасибо!
Ответ №1:
Можете ли вы попробовать измениться:
<img onclick='toggleEdit;' src='../images/edit_button.png'>
Для:
<img onclick='toggleEdit();' src='../images/edit_button.png'>
Кроме того, является ли «оповещение» функцией, которую вы написали?
Комментарии:
1. Хм. Это вызовет toggleEdit при инициализации onclick и вернет его значение как событие onclick, если я не ошибаюсь. Не совсем то, что я пытаюсь сделать. Честно говоря, я не понимал, что у меня все еще есть этот onclick: P Я перепробовал слишком много методов, пытаясь заставить это работать. Спасибо!
2. Нет, это в кавычках, поэтому строка будет оцениваться во время нажатия.
3. Нет, это создало бы анонимную функцию, которая вызывает toggleEdit() и привязывает эту функцию к обработчику события onclick изображения.
4. Ах, я понимаю. Извините за упрямство: P toggleEdit(); не сработал, хотя я изменил это на alert, и это сработало. Итак, я предполагаю, что сейчас возникла проблема с моей функцией toggleEdit. Хотя это с моей стороны. Похоже, ваше решение сработало! 🙂 Большое вам спасибо! Хотя мне все еще немного любопытно, почему функция buttonelement.onclick не сработала.
5. Да, окно. оповещение не является функцией Javascript и не может использоваться в качестве обратного вызова для обработчика щелчков. Вам нужно будет обернуть его в функцию Javascript, что-то вроде
.onclick = function() { alert(''); };
Ответ №2:
Начните с изменения этого:
editbuttonelement.onclick = alert; //Does nothing.
к этому:
editbuttonelement.onclick = function() {alert("Got a click");};
а затем измените это:
var editbutton = "<a id='" editbuttonid "' href='#'><img onclick='toggleEdit;' src='../images/edit_button.png'></a>";
к этому:
var editbutton = "<a id='" editbuttonid "' href='#'><img onclick='toggleEdit();' src='../images/edit_button.png'></a>";
На что вы нажимаете? Изображение, или ссылка, или промежуток времени? Знаете ли вы, что вызывает событие click?
Комментарии:
1. На самом деле это еще одна проблема, с которой я столкнулся ранее. Я делал что-то подобное, но при создании анонимной функции firefox сообщал мне, что у функции должно быть имя (странно, да?). Но я просто ввел то, что вы просили, и это не дает мне такой ошибки, хотя и случается до сих пор. Хотя спасибо.
Ответ №3:
document.getElementById('widget_Text_01_editbutton').onclick = alert;
причины illegal invocation
, потому что он пытается установить this
что-то другое (элемент), чем window
внутри alert
.
alert.call( {} )
//TypeError: Illegal invocation
alert.bind( window ).call( {} )
//works
Так что либо:
document.getElementById('widget_Text_01_editbutton').onclick = alert.bind( window );
или даже лучше, поскольку вышеуказанное будет работать только в некоторых браузерах:
document.getElementById('widget_Text_01_editbutton').onclick = function(){alert();};
Комментарии:
1. Спасибо за ответ! К сожалению, когда я помещаю это в FireBug, я по-прежнему получаю точно такую же ошибку при нажатии на кнопку. Кроме того, это также бесполезно в коде. Это настоящий тупик, а? : P Спасибо!
2. Это не та же ошибка, ошибка, которую вы сейчас получаете, заключается в том, что нечего предупреждать (что характерно для firefox, chrome ничего не предупреждает). Попробуйте
alert.bind( window, "123" );
Ответ №4:
Это поможет вам в выполнении.
<img onclick='toggleEdit;' src='../images/edit_button.png'>