не удается добавить прослушиватели событий click / mouseup / mousedown в

#javascript #jquery #click #mousedown #mouseup

#javascript #jquery #нажмите #mousedown #mouseup

Вопрос:

Я пытаюсь создать кнопку в <a href="#" ...> теге, используя HTML CSS Javascript jQuery. Кнопка отображается правильно. Однако, когда я нажимаю на него, ничего не происходит, за исключением поведения по умолчанию (т. Е. Перехода к «#»). Любые предложения о том, что я делаю неправильно? Вот мой код:

     //container is a div created with 
    //borderDiv = document.createElement('div') and 
    //document.body.appendChild(borderDiv);

function addMenuNavigation(container) {
    var temp_innerHTML = ''    
    '<div id="titleBar" class="titleBar">'  

    '<div id="menuTitle" class="menuTitle"><img id="titleImage" style="height: 70px; position: absolute; top: 2px; left:120px"></img></div>'  

    '<a href="#" class="leftButton" id="leftButton">'   
    '   <div style="position: relative; top: 6px;"><img src="'   getURL('img/menu/iPhoneStyle/chevronLeft.png')   '"></img></div>'  
    '</a>'  

    '</div>'   //titleBar
    '';

    container.innerHTML = temp_innerHTML;

    var $leftButton = $('#leftButton');
    console.dir($leftButton); //Indeed it does display the #leftButton element


    //FIXME BUG 'MenuNavigation' below functions do not get registered ...

    $('#leftButton').mousedown(function(e) {
        $('#leftButton').addClass("pressed");
        console.log('leftButton down '   this.id);
    });
    $('#leftButton').mouseup(function(e) {
        console.log('leftButton up '   this.id);
        $(this).removeClass("pressed");
    });
    $('#leftButton').click(function(e){
        console.log('leftButton clicked '   this.id);
        click_e.preventDefault();
    });

}
  

.css выглядит следующим образом

 .titleBar {
    ...
    display: block;
    height: 63px;
    opacity: 0.8;
    padding: 6px 0;
    ...           
    background-image: -webkit-gradient(linear, left top, left bottom, 
                                       from(#bbb), to(#444));                                                                    


    z-index: 35;                       
}


.leftButton:not(ac_hidden), .leftButton:not(pressed) {
    left: 6px;
    ...
    -webkit-border-image: url(../img/menu/iPhoneStyle/back_button.png) 0 8 0 8;
}


.leftButton.pressed{
    -webkit-border-image: url(../img/menu/iPhoneStyle/back_button_clicked.png) 0 8 0 8;
}
  

Я работаю с Chrome.

Есть предложения? Спасибо.

Ответ №1:

 $('#leftButton').click(function(e){
        console.log('leftButton clicked '   this.id);
        click_e.preventDefault();
    });
  

должно быть e.preventDefault();

Ответ №2:

Я лично предпочитаю добавлять свои обработчики событий таким образом:

 function addMenuNavigation(container) {
    var container = $(container).empty();
    var titleBar = $('<div id="titleBar/>');
    var leftButton = $('<a href="#">Image here</a>').mousedown(leftButtonMousedown).mouseup(leftButtonMouseup).click(leftButtonClick).appendTo(titleBar);
    titleBar.appendTo(container);
}

function leftButtonMouseDown(e) { //mouse down handler
}
function leftButtonMouseUp(e) { //mouse up handler
}
function leftButtonClick(e) {
    e.preventDefault();
    // handle the click here
}
  

Комментарии:

1. Спасибо. Я обязательно рассмотрю этот стиль в следующий раз.

Ответ №3:

Может быть, браузер еще не закончил добавлять ваш HTML в DOM, прежде чем вы попытаетесь прикрепить к нему событие?

т. е. между этими двумя строками?

 container.innerHTML = temp_innerHTML;

var $leftButton = $('#leftButton');
  

В этом случае, возможно, вы хотите присоединить события с помощью .live(),http://api.jquery.com/live /

Комментарии:

1. Спасибо!! Я использовал .on() api.jquery.com/on , что, похоже, эквивалентно .live() для jquery 1.7, и это сработало.

2. Да, это довольно раздражающая проблема — я сталкивался с ней несколько раз. По-видимому, HTML5 определяет событие, когда DOM изменяется, а затем снова полностью загружается. Которые могут использоваться для таких вещей, как $(«#leftButton»).ready(…)