2015-04-24 4 views
3

Так что я был в предположении, что эта функцияJavascript button.onclick не работает, как я думал

button.onclick = exampleFunk; 

даст мне обработчик на каждой кнопке, когда я нажимаю их, но это не так. При замене его на:

button.onclick = alert("bananas"); 

Я получаю оповещения на странице при загрузке. Проблема уже решена с этим:

button.setAttribute("onclick", "removeIssue(this)"); 

Из любопытства ... Что происходит?

отредактирован расположение поста

EDIT

var issues = []; 

window.onload = function() { 
    //alert("venster geladen"); 
    issuesToList() 
} 



function issuesToList(data) { 
    /*alert( 
     "array length is " + data.issues.length + "\n" + 
     "total_count is " + data.total_count + "\n" + 
     "limit is " + data.limit + "\n" + 
     "offset is " + data.offset + "\n" + "" 
     );*/ 

    for (i = 0; i < data.issues.length; i++) { 
     issue = data.issues[i]; 
     createIssue(issue); 
    } 
} 


function createIssue(issue){ 


    var id = issue.id; 
    var tracker = issue.tracker; 
    var status = issue.status; 
    var priority = issue.priority; 
    var subject = issue.subject; 
    var description = issue.description; 
    var assignee = issue.assignee; 
    var watchers = issue.watchers; 

    var ticket = new Issue(id, tracker, status, priority, subject, description, assignee, watchers); 
    issues.push(ticket); 

    var button = document.createElement("button"); 
    button.innerHTML = "-"; 


    button.onclick = function(){ alert("bananas")}; 
    //button.setAttribute("onclick", "removeIssue(this)"); 

    var item = document.createElement("div");  
    item.setAttribute("id", id); 
    item.appendChild(button); 
    item.innerHTML += " " + subject; 

    var container = document.getElementById("container"); 
    container.appendChild(item); 


} 


function removeIssue(e){ 
    var key = e.parentNode.getAttribute("id"); 
    var count = issues.length; 

    if(confirm("Confirm to delete")){ 
     for(i=0; i<count; i++){ 
       if (issues[i].id == key){ 
       issues.splice(i,1); 
       var element = document.getElementById(key); 
       element.parentNode.removeChild(element); 
      } 
     } 
    } 
} 


function Issue(id, tracker, status, priority, subject, description, assignee, watchers){ 
    this.id = id; 
    this.tracker = tracker; 
    this.status = status; 
    this.priority = priority; 
    this.subject = subject; 
    this.description = description; 
    this.assignee = assignee; 
    this.watchers = watchers; 
} 

EDIT

<body> 

    <h1>List of Issues</h1> 
    <div id="container"></div> 

    <script src="http://www.redmine.org/issues.json?limit=10&callback=issuesToList"></script> 


</body> 
+0

вы можете попробовать это button.addEventListener («щелчок», функция() {Alert ("оповещать");}); ? – Sushil

+0

button.addEventListener («click», alert («alert»)); Я попробовал это. потому что ваш @sushil также не работал. Получение оповещений на загрузке страницы снова – Josephus87

+0

попробуйте вызвать его в функции onload() – Sushil

ответ

3

Вам необходимо маскировать alert в function:

button.onclick = function(){ alert("bananas")}; 

Как таковой:

var btn = document.createElement("BUTTON"); 
 
var t = document.createTextNode("CLICK ME"); 
 
btn.appendChild(t); 
 
btn.onclick = function() {alert("bananas")}; 
 
document.body.appendChild(btn);

+0

при добавлении его в шахту это не работает, плохо дать полный код – Josephus87

0

Вы можете связать аргументы функции так, чтобы она возвращала с функцией вы хотите, чтобы позвонить, используя свои аргументы (Зачет дополнительные аргументы позже добавлено до конца). Этот способ не требует написания внешнего кода (когда все, что вы хотите сделать, это вызвать одну функцию) и выглядит намного более гладко. Смотрите следующий пример:

button.onclick = alert.bind(window, "bananas"); 

неродственного пример того, как это работает в вашем собственном коде, как это:

var alert2 = alert.bind(window, 'Predefined arg'); 
alert2(); // 'Predefined arg' 
alert2('Unused'); // 'Predefined arg' 

Для IE, это требует IE9 как минимум. См. MDN для получения дополнительной информации.


EDIT: Я присмотрелся на ваш код и был одно существенное изменение, которое было необходимо для того, чтобы работать ... Вы не можете добавить на innerHTML, когда вы добавили свойства JavaScript к дочерний элемент. Изменение innerHTML родительского элемента преобразует ваш элемент в HTML, который не будет иметь свойство onclick, которое вы сделали ранее. Используйте element.appendChild(document.createTextNode('My text')), чтобы добавить текст динамически.

См функционирующий пример здесь: http://jsfiddle.net/2ftmh0gh/2/

+0

Так как я могу прикрепить его к функции removeIssue(). removeIssue.bind() не работает. – Josephus87

+0

Вы хотите использовать 'removeIssue.bind (window, item)'. Первый аргумент - это то, что вы хотите, чтобы «эта» была для этой функции (если она вам не нужна, просто используйте «окно» все время), а второй аргумент - это первый аргумент, который будет читать функция. Он использует переменные, к которым у вас есть доступ, когда эта строка сначала вызывается, а не позже, когда вы нажимаете кнопку. – Pluto

+0

Чтобы использовать переменные, событие click переходит к функции, вы просто используете 'button.setAttribute (" onclick ", removeIssue);' и 'this' в' removeIssue' будет элементом кнопки, а 'e'/first аргументом будут данные события клика. – Pluto

0

Что происходит?

Вы: alert() Выполняется на загрузке страницы, так как ее function call. Когда выполнение вашего сценария достигает эту строку вашего задания

button.onclick = alert("bananas"); 

фактически выполняется предупредительное заявление и не присвоив его button.onclick

+0

Без вызова функции нет кнопок ... так что выражение здесь не должно использоваться? – Josephus87

+0

Чтобы назначить его, оберните его внутри 'function', чтобы он выполнялся только на' click' – Zee

Смежные вопросы