วิธีการเปิดหรือปิดการใช้งานสมอโดยใช้ jQuery


150

วิธีการเปิดหรือปิดการใช้งานสมอโดยใช้ jQuery


ขอขอบคุณสำหรับคำตอบทั้งหมดของคุณถึงกระนั้นมันก็ยังใช้งานไม่ได้คุณสามารถทำให้มันใช้งานได้กับ document.ready function
Senthil Kumar Bhaskaran

มันอาจช่วยถ้าคุณโพสต์ตัวอย่างของรหัสที่ไม่ทำงาน
Hooray Im ช่วย

ที่จริงแล้วการเข้ารหัสของฉันอยู่ใน Rails และการเข้ารหัสของฉันคือ <% = foo.add_associated_link ('เพิ่มอีเมล', @ project.email.build)%> เมื่อฉันสร้างมันลงในเบราว์เซอร์ฉันสามารถดูอีเมลได้ แต่ฉันไม่สามารถปิดการใช้งานได้ พยายามกับการเข้ารหัสเช่น e.preventDefault () แต่ไม่มีผล
Senthil Kumar Bhaskaran

คำตอบ:


194

เพื่อป้องกันการยึดจากการติดตามที่ระบุhrefฉันขอแนะนำให้ใช้preventDefault():

// jQuery 1.7+
$(function () {
    $('a.something').on("click", function (e) {
        e.preventDefault();
    });
});

// jQuery < 1.7
$(function () {
    $('a.something').click(function (e) {
        e.preventDefault();
    });

    // or 

    $('a.something').bind("click", function (e) {
        e.preventDefault();
    });
});

ดู:

http://docs.jquery.com/Events/jQuery.Event#event.preventDefault.28.29

ดูคำถามก่อนหน้านี้ใน SO:

jQuery ปิดการใช้งานลิงค์


ฉันลองกับ "attr" เหล่านั้นมันจะทำงานเฉพาะกับองค์ประกอบแบบฟอร์มไม่ได้อยู่ในแท็ก Anchor
Senthil Kumar Bhaskaran

1
@senthil - ป้องกันไม่ให้ถือว่าเป็นวิธีที่ 'ที่เหมาะสมของการทำเช่นนี้เห็นการแก้ไขของฉัน (การเชื่อมโยงไปยังอีก Q + A)
karim79

ที่จริงแล้วการเข้ารหัสของฉันอยู่ใน Rails และการเข้ารหัสของฉันคือ <% = foo.add_associated_link ('เพิ่มอีเมล', @ project.email.build)%> เมื่อฉันสร้างมันลงในเบราว์เซอร์ฉันสามารถดูอีเมลได้ แต่ฉันไม่สามารถปิดการใช้งานได้ พยายามกับการเข้ารหัสเช่น e.preventDefault () แต่ไม่มีผล
Senthil Kumar Bhaskaran

2
ฉันจะย้อนกลับได้$('a.something').on("click", function (e) { e.preventDefault(); });อย่างไร
アレックス

2
ไม่เห็นด้วยใช้ CSS "pointer-events: none;" เช่นเดียวกับในคำตอบอื่น ๆ
vitrilo

116

แอพที่ฉันกำลังทำงานอยู่นั้นใช้สไตล์ CSS ร่วมกับจาวาสคริปต์

a.disabled { color:gray; }

จากนั้นเมื่อใดก็ตามที่ฉันต้องการปิดการใช้งานลิงก์ที่ฉันโทร

$('thelink').addClass('disabled');

จากนั้นในตัวจัดการคลิกของแท็ก 'thelink' ฉันจะเรียกใช้สิ่งแรกเสมอ

if ($('thelink').hasClass('disabled')) return;

6
บรรทัดสุดท้ายไม่ควรพูดว่า "return false;"
Prestaul

1
โทรดี Prestaul เมื่อเชื่อมโยงกับแท็ก <a> ฉันกำลังใช้: <a href="whething" onclick="return disableLink(this)"> .. จากนั้น: function disableLink (node) {ถ้า (dojo.hasClass (โหนด 'disabled') return false; dojo.addClass (node, 'disabled'); return true;} .. นี่ทำให้ลิงก์ถูกคลิกหนึ่งครั้งและ action (return true) และหลังจากนั้นจะไม่อนุญาตการกระทำ (return false).
Neek

โปรดทราบว่าในตัวจัดการคุณควรใช้ $ (นี้) แทน $ ("thelink") เนื่องจากสามารถเปลี่ยนแปลงได้หรือผู้ใช้สามารถคัดลอก / วางรหัสได้อย่างง่ายดาย
Alexis Wilke

2
ขอแนะนำให้คุณเพิ่ม 'เคอร์เซอร์: ค่าเริ่มต้น' กับสไตล์ที่ปิดใช้งาน
Stuart Hallows

40

ฉันพบคำตอบที่ฉันชอบมากขึ้นที่นี่

ดูเหมือนว่านี้:

$(document).ready(function(){
    $("a").click(function () { 
        $(this).fadeTo("fast", .5).removeAttr("href"); 
    });
});

การเปิดใช้งานจะเกี่ยวข้องกับการตั้งค่าแอตทริบิวต์ href

$(document).ready(function(){
    $("a").click(function () { 
        $(this).fadeIn("fast").attr("href", "http://whatever.com/wherever.html"); 
    });
});

สิ่งนี้ทำให้คุณมีลักษณะที่องค์ประกอบจุดยึดกลายเป็นข้อความปกติและในทางกลับกัน



12

ฉันคิดว่าโซลูชันที่ดีกว่าคือการตั้งค่าคุณลักษณะข้อมูลที่ปิดใช้งานและยึดการตรวจสอบเมื่อคลิก วิธีนี้เราสามารถปิดการใช้งานสมอชั่วคราวจนกว่าเช่นจาวาสคริปต์จะเสร็จสิ้นด้วยการโทร ajax หรือการคำนวณบางอย่าง หากเราไม่ปิดใช้งานเราสามารถคลิกได้อย่างรวดเร็วสองสามครั้งซึ่งไม่เป็นที่ต้องการ ...

$('a').live('click', function () {
    var anchor = $(this);

    if (anchor.data("disabled")) {
        return false;
    }

    anchor.data("disabled", "disabled");

    $.ajax({
        url: url,
        data: data,
        cache: false,
        success: function (json) {
            // when it's done, we enable the anchor again
            anchor.removeData("disabled");
        },
        error: function () {
             // there was an error, enable the anchor
            anchor.removeData("disabled");
        }
    });

    return false;
});

ฉันทำตัวอย่าง jsfiddle: http://jsfiddle.net/wgZ59/76/


11

คำตอบที่เลือกไม่ดี

ใช้สไตล์ CSS ตัวชี้เหตุการณ์ (ตามที่แนะนำจาก Rashad Annara)

ดู MDN https://developer.mozilla.org/en-US/docs/Web/CSS/pointer-events มันรองรับเบราว์เซอร์ส่วนใหญ่

การเพิ่มแอตทริบิวต์ "ถูกปิดใช้งาน" เพื่อยึดเหนี่ยวจะทำได้ถ้าคุณมีกฎ CSS ทั่วโลกดังต่อไปนี้:

a[disabled], a[disabled]:hover {
   pointer-events: none;
   color: #e1e1e1;
}

นอกจากนี้ยังมีตัวชี้เหตุการณ์คุณไม่จำเป็นต้องรวม: สถานะการเลื่อนเมาส์ไปที่นั่นเป็นเหตุการณ์ตัวชี้ คุณต้องมีตัวเลือก [ปิดใช้งาน] เท่านั้น
Larry Dukek

10

ลองบรรทัดด้านล่าง

$("#yourbuttonid").attr("disabled", "disabled");
$("#yourbuttonid").removeAttr("href");

เพราะแม้ว่าคุณจะปิดการใช้งาน<a>แท็กhrefคุณก็จะต้องลบhrefมันด้วย

เมื่อคุณต้องการเปิดใช้งานลองบรรทัดด้านล่าง

$("#yourbuttonid").removeAttr("disabled");
$("#yourbuttonid").attr("href", "#nav-panel");

1
นี่คือสิ่งที่ฉันต้องการเมื่อใช้ JQuery กับ ASP.net MVC ActionLink ขอบคุณ!
eaglei22

8

มันง่ายเหมือนการตีกลับผิด ๆ

อดีต

jQuery("li a:eq(0)").click(function(){
   return false;
})

หรือ

jQuery("#menu a").click(function(){
   return false;
})


5
$("a").click(function(event) {
  event.preventDefault();
});

หากวิธีการนี้เรียกว่าการกระทำเริ่มต้นของกิจกรรมจะไม่ถูกเรียก



4

คุณไม่เคยระบุว่าคุณต้องการให้พวกเขาปิดการใช้งานหรือสิ่งที่จะทำให้การปิด

ขั้นแรกคุณต้องการทราบวิธีการตั้งค่าเป็นปิดการใช้งานสำหรับการที่คุณจะใช้ฟังก์ชั่นคุณสมบัติ JQuery ของและมีฟังก์ชั่นที่เกิดขึ้นในเหตุการณ์เช่นการคลิกหรือการโหลดเอกสาร


1

สำหรับสถานการณ์ที่คุณต้องใส่เนื้อหาข้อความหรือ html ในแท็กจุดยึด แต่คุณไม่ต้องการให้มีการกระทำใด ๆ เมื่อองค์ประกอบนั้นถูกคลิก (เช่นเมื่อคุณต้องการให้ตัวเชื่อมโยง paginator อยู่ในสถานะปิดใช้งานเนื่องจากเป็น หน้าปัจจุบัน) เพียงตัด href ออก ;)

<a>3 (current page, I'm totally disabled!)</a>

คำตอบโดย @ michael-meadows ให้ทิปกับฉัน แต่สิ่งนี้ยังคงกล่าวถึงสถานการณ์ที่คุณยังต้องทำงานกับ jQuery / JS ในกรณีนี้หากคุณสามารถควบคุมการเขียน html เองเพียงแค่ x-ing แท็ก href นั้นเป็นสิ่งที่คุณต้องทำดังนั้นการแก้ปัญหาจึงเป็น HTML ที่บริสุทธิ์!

โซลูชันอื่น ๆ ที่ไม่มี jQuery finagling ซึ่งเก็บ href ต้องให้คุณใส่ # ใน href แต่นั่นทำให้หน้าเด้งขึ้นไปด้านบนและคุณแค่ต้องการให้มันปิดการใช้งานแบบเก่า หรือปล่อยว่างไว้ แต่ขึ้นอยู่กับเบราว์เซอร์ซึ่งยังคงทำสิ่งต่าง ๆ เช่นข้ามไปด้านบนและเป็น HTML ที่ไม่ถูกต้องตาม IDEs แต่เห็นได้ชัดว่าaแท็กเป็น HTML ที่ถูกต้องทั้งหมดโดยไม่มี HREF

สุดท้ายคุณอาจพูดว่า: โอเคทำไมไม่เพียงแค่ทิ้งแท็กทั้งหมดด้วยกันล่ะ? เนื่องจากบ่อยครั้งที่คุณทำไม่ได้aแท็กจะถูกใช้เพื่อวัตถุประสงค์ในการใส่สไตล์ในเฟรมเวิร์ก CSS หรือการควบคุมที่คุณกำลังใช้เช่นตัวจัดระเบียบของ Bootstrap:

http://twitter.github.io/bootstrap/components.html#pagination


1

ดังนั้นด้วยการรวมกันของคำตอบข้างต้นฉันจึงได้สิ่งนี้ขึ้นมา

a.disabled { color: #555555; cursor: default; text-decoration: none; }

$(".yourClass").addClass("disabled").click(function(e){ e.preventDefault(); 

0

หากคุณไม่ต้องการให้มันทำหน้าที่เป็นจุดยึดแท็กฉันก็อยากจะแทนที่มันเลย ตัวอย่างเช่นถ้าแท็กสมอของคุณเป็นเช่นนั้น

<a class="MyLink" href="http://www.google.com"><span>My</span> <strong>Link</strong></a>

จากนั้นใช้ jQuery คุณสามารถทำได้เมื่อคุณต้องการแสดงข้อความแทนลิงค์

var content = $(".MyLink").text(); // or .html()
$(".MyLink").replaceWith("<div>" + content + "</div>")

ด้วยวิธีนี้เราสามารถแทนที่แท็ก anchor ด้วยแท็ก div นี่ง่ายกว่ามาก (แค่ 2 บรรทัด) และถูกต้องทางความหมายเช่นกัน (เพราะเราไม่ต้องการลิงค์ตอนนี้ดังนั้นจึงไม่ควรมีลิงค์)


0

ปิดใช้งานหรือเปิดใช้งานองค์ประกอบใด ๆ ด้วยคุณสมบัติที่ถูกปิดใช้งาน

// Disable 
$("#myAnchor").prop( "disabled", true );

// Enable
$( "#myAnchor" ).prop( "disabled", false );

ทำไมคำตอบนี้ลงคะแนน? มันตอบคำถาม "วิธีการเปิดหรือปิดการใช้งานสมอโดยใช้ jQuery"
RitchieD

ฉันเชื่อว่าเป็นเพราะลิงก์ยังคงเปิดเมื่อคลิกที่จุดยึด
Zombaya
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.