2013-08-14 3 views
1

У меня есть следующий фрагмент кода, но, несмотря на то, что нажатие ссылки event.preventDefault() по-прежнему приводит к открытию этого целевого div! Я прочитал все вопросы по этой проблеме в stackoverflow, но ни одна из них не решила мою проблему. Часть предупреждения выполняется, но event.preventDefault() не работает! Пожалуйста, помогите мне!event.preventDefault() не позволяет открыть ссылку

HTML, является:

<ul class="projects-info"> 
    <li><a href="#tabs-1">file upload</a></li>                  
    <li class="projects-det"><a href="#tabs-2">file specification</a></li> 
</ul> 
<div style="border:1px solid #1c94c4;" id="tabs-2"> 
    this is the div content 
</div> 

JQuery является:

<script type="text/javascript" src="Scripts/jquery-1.10.2.min.js"></script> 
<script type="text/javascript"> 
    $(document).ready(function() 
    { 
     $("ul.projects-info li.projects-det a").bind('click',function(event) 
     { 
     event = event || window.event; 
    alert("for checking"); 
     if(event.preventDefault) 
     { 
      event.preventDefault(); 
     } 
     if (event.stopPropagation) 
     { 
      event.stopPropagation(); 
     } 
     return false; 
    }); 
}); 
+4

Можете ли вы воспроизвести проблему на http://jsfiddle.net? Обратите внимание, что jQuery нормализует метод 'preventDefault', и нет необходимости проверять метод, а' preventDefault' не останавливает выполнение других обработчиков. – undefined

+0

Ваш код, как показано ниже: http://jsfiddle.net/Thrfn/ - есть ли у вас другой JS/jQuery на странице? В дополнение к тому, что undefined сказал о jQuery, нормализующем 'preventDefault()', он также нормализует объект 'event', поэтому нет необходимости в тесте с' window.event'. То же самое для 'stopPropagation()'. – nnnnnn

ответ

2

Похоже, что вы используете другую библиотеку для поддержки интерфейса с вкладками.

Если ссылка является обычной гиперссылкой на другую страницу, тогда да preventDefault остановит это.

Однако, если есть два обработчика, связанных с одним и тем же событием (в вашем случае «нажмите»), то каждый работает независимо друг от друга. Вы не можете контролировать порядок, и они не могут подавлять друг друга.

Так что обработчики, которые обязаны выполнять табуляцию, все равно активируются.

Вот скрипка: http://jsfiddle.net/4J9Ap/

Два Обработчики привязаны к одной и той же ссылке - как огню.

$(document).ready(function() 
    { 
     $("ul.projects-info li.projects-det a").bind('click',function(event) 
     { 
     event = event || window.event; 
     if(event.preventDefault) 
     { 
      event.preventDefault(); 
     } 
     if (event.stopPropagation) 
     { 
      event.stopPropagation(); 
     } 
     alert("handler 1") 
     return false; 
     }); 

    $("a#myLink").bind('click',function(event) 
     { 
     event = event || window.event; 
     if(event.preventDefault) 
     { 
      event.preventDefault(); 
     } 
     if (event.stopPropagation) 
     { 
      event.stopPropagation(); 
     } 
      alert("handler 2") 
     return false; 
     }); 
}); 
+0

Rob Shepherd Ты слишком умный :) Да, это правильно. У меня есть две вкладки (ссылки), при нажатии каждой из которых отображается соответствующий div (содержимое). –

+0

Но я хочу отключить вторую вкладку. Я имею в виду, что мне нужно, чтобы пользователь сначала заполнил информацию в первом div (первая вкладка). Если нет, он не сможет посещать содержимое второй вкладки (div). Вот почему я использовал preventDefault() на второй вкладке, но, похоже, она не работает. Что я могу сделать в этой ситуации? –

+1

Вы можете решить, как включить табуляцию в первую очередь, а затем добавить вкладку-2, когда будете готовы. Также вы можете уничтожить * ALL * обработчики, используя 'off()' (см. Http://jsfiddle.net/4J9Ap/1/), а затем попробуйте и верните их позже. не так ли? :) К сожалению, это трудно сделать, когда у вас есть другие фреймворки/библиотеки, соткающие волшебство для ваших элементов страницы. –

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