2016-12-12 4 views
0

У меня есть веб-страница с меню + подменю с букетом <a> анкеры. При нажатии любого из этих якорей открывается страница iframe. Он отлично работает, за исключением того, что в мобильных браузерах подменю остается открытым даже после нажатия на него, поэтому событие не «потребляется». Зачем?Почему событие не используется?

Я делаю это со следующим. Во-первых, я поставил onclick функцию:

var anchors = MyMethodGetElementByClassName('loadt'); 
for(var i = 0; i < anchors.length; i++) { 
anchors[i].onclick = function(e) { 
    loadthis(e,this.href); 
} 
} 

В методе loadthis, я делаю это:

function loadthis(e,pg) 
var evt = e || window.event; 
if (evt != 88 && evt !== "null") { 
    evt.preventDefault(); 
} 
frame.src = pg; 
$('html').trigger('click'); 
return false; 
} 

Последние две строки loadthis будут стараться потреблять событие, вызывая щелчок в документ и возвращая false. Тем не менее, подменю остаются открытыми.

Посмотрите here в смартфоне (нажмите, скажем, в «Программное обеспечение> Ave»).

+0

Не имеет отношения к вопросу, возможно, инвестируйте в изменение шрифта из Comic Sans .. – Stefan

+0

Мне любопытно: он выглядит так, как будто вы используете jQuery из этого '$ ('html'). Trigger ('click ").' Если это так, почему вы не используете его для поиска элементов, подключения обработчика и нормализации обработки событий в браузерах? –

+0

@TJCrowder: Я не знаком с JQuery, мой код почти не работает, я не знаю об этой «нормализации» ...? –

ответ

1

Ваш обработчик не возвращает никакой ценности. Функция, которую он вызывает (loadthis), но это не так. (Но продолжайте читать.)

Чтобы сделать обработчик возвращает значение, возвращает результат вызова loadthis:

var anchors = MyMethodGetElementByClassName('loadt'); 
for(var i = 0; i < anchors.length; i++) { 
anchors[i].onclick = function(e) { 
    return loadthis(e,this.href); 
//^^^^^^^ 
} 
} 

Кроме того, вы, как представляется, поддерживает старые браузеры. Если это так, вам нужно поставить охрану на свой вызов preventDefault (хотя на самом деле вам это не нужно, так как вы подключаете событие, return false достаточно, details in this minor post on my blog). Например .:

function loadthis(e,pg) 
var evt = e || window.event; 
if (evt != 88 && evt !== "null" && evt.preventDefault) { 
// -----------------------------^^^^^^^^^^^^^^^^^^^^^^ 
    evt.preventDefault(); 
} 
frame.src = pg; 
$('html').trigger('click'); 
return false; 
} 

Наконец: evt всегда будет != 88 и всегда будет !== "null", так что вы могли бы и, вероятно, следует удалить их.

Однако, вы, кажется, используете jQuery, из этой линии $('html').trigger('click');. Если да, то все это может быть заметно упрощен:

$(".loadt").on("click", function() { 
    $('html').trigger('click'); 
    return false; 
}); 

... так как evt != 88 && evt !== "null" всегда будет верно в любом случае ... Это будет также остановить распространение (вместо того, чтобы просто предотвратить дефолт), который может помочь.

+0

Добавил 'return' и 'evt.preventDefault', но проблема сохраняется (вы можете проверить страницу). (Дело в том, что метод длиннее, я просто показал соответствующие части, но забыл удалить 88. Мой плохой). –

+0

@LuisA. Флорит: Возможно, это будет t вам нужно прекратить распространение, а также предотвратить по умолчанию, см. бит jQuery в конце ответа. –

+0

Вы хотели добавить 'loadthis' в свой код JQuery тоже, правильно?И, извините, но что значит «предотвратить распространение»? –

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