จะสร้างลิงค์สมอที่ว่างเปล่าที่มี l () ได้อย่างไร?


20

ฉันพยายามที่จะใช้l()เพื่อให้ได้สิ่งที่ต้องการ<a href='#' ...>สำหรับการโทร ajax /programming/1698453/drupal-creating-anchor-only-link-with-lอยู่ใกล้กับสิ่งที่ถูกต้อง - ใช้ตัวเลือกในl()เช่น'fragment' => 'foo'การผลิตการเชื่อมโยงเช่น<a href='#foo'...>- แต่ฉัน พยายามทำความสะอาด '#' มีวิธีใดบ้างที่จะทำเช่นนี้หรือฉันควรใส่บางอย่างในส่วนของชิ้นส่วนและไม่ต้องกังวลกับมัน?

คำตอบ:


12

ถ้าคุณไม่สามารถใช้ทำความสะอาด "#" <a href="javascript:">link</a>กับส่วนผมขอแนะนำให้คุณใช้
เมื่อเพิ่ม "javascript:" หรือ "javascript: void (0)" ในhrefแอตทริบิวต์<a>แท็กจะไม่ทำอะไรเลย จากนั้นคุณสามารถผูก "onclick" เพื่อเชื่อมโยงเพื่อ ajax ของคุณ
คุณสามารถใช้สิ่งนี้โดยใช้l()ฟังก์ชั่นด้านล่าง:

     l('link', 'javascript:',  array('external' => TRUE));

แล้วjavascript:void(0)
Serjas

1
@ Serjas javascript:และjavascript:void(0)เหมือนกัน ข้อแตกต่างคือ "void (0)" :)
Sithu

ฉันหมายถึงจะ l () แปลง ()?
Serjas

6
คุณไม่ควรใช้ shenanigans เช่นนั้นและใช้ JavaScript เป็นตัวขับเคลื่อนเหตุการณ์! นี่คือ 2012 ไม่ใช่ 2004 เหตุใดคำตอบที่มีคุณภาพต่ำจึงได้รับการโหวต เป็นที่นิยมเพราะมันง่าย แต่มันผิดมาก :(

@chx เนื่องจากคุณเป็นผู้ดูแลระบบหลักของ drupal ฉันหวังว่าคุณจะไม่ใช้พารามิเตอร์ที่สองในการใช้ฟังก์ชัน l () แทนการใช้พา ธ หรือส่วน น่าเสียดายที่ฟังก์ชั่นนั้นยอมรับ "javascript" เป็นพา ธ :) ถ้ามันผิดมากทำไม Drupal ถึงยอมรับ อาจจะถูก จำกัด ในรุ่น Drupal ในภายหลัง
Sithu

15

PHP พิมพ์เวลาตอบคำถามป๊อป! (การเปิดเผยอย่างเต็มรูปแบบ: ฉันไม่ชนะในสำนักงานของเรา)

ตามที่ได้กล่าวไปแล้วนี่คือรหัสl()ที่เรากังวล:

if (isset($options['fragment']) && $options['fragment'] !== '') {
  $options['fragment'] = '#' . $options['fragment'];
}

ดังนั้นนี่คือคำถาม: ค่าอะไรที่ปลดสตริงว่าง แต่ส่งต่อไปนี้?

(isset($var) && $var !== '')

คำตอบคือ: FALSE!

ดังนั้นเราสามารถลองสิ่งนี้:

l(t('My link'), NULL, array('fragment' => FALSE));

ซึ่งทำให้เรา:

<a href="/#">My link</a>

โชคดีที่เราสามารถตัดเครื่องหมายทับที่นำโดยผ่านexternal => TRUE:

l(t('My link'), NULL, array('external' => TRUE, 'fragment' => FALSE));

ซึ่งทำให้เรา:

<a href="#">My link</a>

ความเจริญ สิ่งที่เราทำเพื่อหลีกเลี่ยงการเชื่อมสตริง html ด้วยตนเองใช่มั้ย

Postscript:

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

หากลิงก์จริงๆเพียงทำให้รู้สึกกับจาวาสคริปต์รอบ ๆ (เช่นการควบคุมสำหรับ js เท่านั้นสไลด์โชว์หรืออะไร) ผมคิดว่ามันจะดีกว่าที่จะเพิ่มการเชื่อมโยงไปยังหน้าเว็บที่มีจาวาสคริปต์ อีกวิธีหนึ่งถ้าคุณต้องการวางไว้ในแหล่งที่มาของคุณตรวจสอบให้แน่ใจว่าเป็นdisplay:noneค่าเริ่มต้น Drupal มี.jsคลาสบน html เพื่อแสดงเมื่อ javascript ใกล้เคียง


7

น่าเสียดายที่url()ฟังก์ชั่น (ซึ่งl()เรียกภายใน) ค่อนข้าง nukes โอกาสของชิ้นส่วนที่ว่างเปล่าที่มีบรรทัดต่อไปนี้:

if (isset($options['fragment']) && $options['fragment'] !== '') {
  $options['fragment'] = '#' . $options['fragment'];
}

#มันจะตรวจสอบเพื่อให้แน่ใจว่าชิ้นส่วนที่ไม่ได้เป็นสตริงที่ว่างเปล่าซึ่งเป็นสิ่งที่คุณจะต้องผ่านที่จะได้รับการทำความสะอาด ฉันคิดว่าวิธีแก้ปัญหาที่ง่ายที่สุดคือการเลือกไอดีขององค์ประกอบที่เหมาะสมในที่ใดที่หนึ่งในหน้าและใช้สิ่งนั้นสำหรับjavascript:voidแฟรกเมนต์แทน

อย่างไรก็ตาม ... วิธีที่เข้าถึงได้ง่ายที่สุด (และต่อมาในหลาย ๆ ประเทศทางกฎหมายคิดว่ามาตรา 508ในสหรัฐอเมริกาDDAในสหราชอาณาจักรและอื่น ๆ ) จะให้เนื้อหาที่มีการโหลด / ปรับปรุงโดยลิงก์ของคุณใน แยกหน้าและใช้ URL สำหรับหน้านั้นเป็นลิงค์ของ href แทน จากนั้นคุณจะใช้จาวาสคริปต์เพื่อหยุดเหตุการณ์บนลิงก์จากการเปลี่ยนเส้นทางหน้าจริงสำหรับเบราว์เซอร์ที่เปิดใช้งาน

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


แก้ไขได้ดีเกี่ยวกับทางเลือก! หากเราใช้ ajax URL ในลิงก์ของ href หน้าการโทรสามารถเป็น HTML ที่สามารถแสดงผลได้หากปิดการใช้งานจาวาสคริปต์ ฉันเคยมีprint drupal_json_output($output)ในหน้าโทรอาแจ็กซ์ของฉัน
Sithu

4

คุณไม่สามารถใช้ทำความสะอาด#ได้

แต่เป็นไปได้ที่จะเพิ่มspace symbolหลังจาก#:

  l('Link title', '# ', array('external' => TRUE));

2

ฉันเพิ่งมีปัญหาเดียวกัน แต่ไม่มีวิธีการแก้ปัญหาที่น่าพอใจดังนั้นฉันจึงมากับตัวเอง:

l('link', '', array('fragment' => ' ', 'html' => TRUE, 'external' => TRUE));

สิ่งนี้ก่อให้เกิดความสะอาด #

<a href="#">link</a>

ปิดนี้สร้าง<a href="# ">link</a>สำหรับฉัน
tyler.frankenstein

1

ฉันจะใช้ประเภทการแสดงผลhtml_tagแทนเพราะฉันเชื่อว่าลิงก์การแสดงผลได้รับความสนใจเป็นพิเศษจาก Drupal ข้อเสียคือไม่มีฟังก์ชั่นลัดดังนั้นเราจะต้องใช้เรนเดอร์เรนเดอร์:

array (
  '#type' => 'html_tag',
  '#tag' => 'a',
  '#attributes' => array (
    'href' => '#',
  ),
);

0

นี่เป็นคำตอบเดียวกับที่ฉันโพสต์ที่นี่ ... การตั้งค่าfragmentเป็นช่องว่างเดียวจะแปลงเป็น a #และ$current_pathรวมอยู่ด้วยเพราะไม่เช่นนั้นลิงก์จะถูกตั้งค่าเป็นwww.example.com/#แทนที่จะเป็นwww.example.com/current-page#:

$current_path = check_url(drupal_get_path_alias($_GET['q']));
$link = l('link', $current_path, array('fragment' => ' '));

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