Làm cách nào để tạo liên kết chỉ neo EMPTY với l ()?


20

Tôi đang cố gắng sử dụng l()để có được một cái gì đó như <a href='#' ...>, cho mục đích gọi ajax. /programming/1698453/drupal-creating-anchor-only-link-with-l rất gần với điều đúng - sử dụng một tùy chọn trong l()như 'fragment' => 'foo'để tạo ra một liên kết như <a href='#foo'...>- nhưng tôi cố gắng để có được một '#' sạch sẽ. Có cách nào để làm điều này không, hay tôi chỉ nên đặt thứ gì đó vào như một phần của mảnh vỡ và không lo lắng về nó?

Câu trả lời:


12

Nếu bạn không thể sử dụng "#" sạch với phân đoạn, tôi sẽ đề nghị bạn sử dụng <a href="javascript:">link</a>.
Khi thêm "javascript:" hoặc "javascript: void (0)" vào hrefthuộc tính, <a>thẻ sẽ không làm gì cả. Sau đó, bạn có thể liên kết "onclick" với liên kết cho mục đích ajax của bạn.
Bạn có thể thực hiện điều này bằng cách sử dụng l()chức năng như dưới đây:

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

những gì vềjavascript:void(0)
Serjas

1
@Serjas, javascript:javascript:void(0)đều giống nhau. Sự khác biệt duy nhất là "void (0)" :)
Sithu

Ý tôi là l () convert ()?
Serjas

6
Bạn không bao giờ nên sử dụng các shenanigans như vậy và chỉ sử dụng JavaScript hướng sự kiện! Đây là năm 2012 chứ không phải năm 2004. Tại sao một câu trả lời chất lượng thấp như vậy lại được bình chọn? Phổ biến vì nó dễ? Nhưng nó cực kỳ sai. :(

@chx, vì bạn là người duy trì lõi drupal, tôi hy vọng bạn không lạm dụng không sử dụng tham số thứ hai cho hàm l () thay vì đường dẫn hoặc đoạn. Thật không may, hàm chấp nhận "javascript" là một đường dẫn :) Nếu nó cực kỳ sai, tại sao Drupal chấp nhận nó. Có lẽ, nó sẽ bị hạn chế trong các phiên bản Drupal sau này.
Sithu

15

PHP typecasting pop thời gian đố! (Tiết lộ đầy đủ: Tôi đã không giành chiến thắng trong văn phòng của chúng tôi).

Như đã chỉ ra, đây là mã l()mà chúng tôi quan tâm:

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

Vì vậy, đây là câu hỏi: Giá trị nào chuyển thành một chuỗi rỗng nhưng vượt qua sau đây?

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

Câu trả lời là : FALSE!

Vì vậy, chúng ta có thể thử điều này:

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

Cung cấp cho chúng tôi:

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

Rất may, chúng ta có thể loại bỏ dấu gạch chéo hàng đầu đó bằng cách chuyển qua external => TRUE:

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

Cung cấp cho chúng tôi:

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

Bùng nổ. Những điều chúng tôi làm để tránh nối chuỗi html bằng tay, eh?

Bản thảo:

Tôi không chắc chắn tôi thực sự khuyên bạn nên in một liên kết như thế này từ php trong các trường hợp thông thường. Không có javascript của bạn, tất cả các liên kết sẽ làm điều đó sẽ đưa người dùng của bạn lên đầu trang ( điều mà tôi hơi ngạc nhiên là hành vi được suy đoán ). Nó có lẽ nên chỉ ra một nơi nào đó hoạt động mà không có javascript.

Nếu liên kết thực sự chỉ có ý nghĩa với javascript xung quanh (như các điều khiển cho trình chiếu chỉ js hoặc một cái gì đó), tôi nghĩ tốt hơn là thêm liên kết vào trang bằng javascript. Ngoài ra, nếu bạn thực sự muốn đặt nó vào nguồn của mình, hãy đảm bảo rằng nó display:nonetheo mặc định. Drupal có .jslớp trên html để hiển thị nó khi javascript ở xung quanh.


7

Thật không may, url()hàm ( l()gọi nội bộ) khá nhiều khả năng có một đoạn trống với các dòng sau:

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

Nó kiểm tra để đảm bảo đoạn không phải là một chuỗi rỗng, đó là những gì bạn cần vượt qua để làm sạch #. Tôi nghĩ giải pháp đơn giản nhất là chọn id của một yếu tố phù hợp ở đâu đó trong trang và sử dụng nó cho đoạn đó (hoặc javascript:voidnhư Sithu đã đề cập).

Tuy nhiên ... cách dễ tiếp cận nhất (và sau đó, ở nhiều quốc gia, cách hợp pháp; nghĩ phần 508 ở Hoa Kỳ, DDA ở Anh, v.v.) sẽ là cung cấp nội dung được tải / điều chỉnh bởi liên kết của bạn trên thay vào đó là một trang riêng và sử dụng URL cho trang đó làm liên kết. Sau đó, bạn sẽ sử dụng javascript để ngăn sự kiện trên liên kết thực sự chuyển hướng trang cho những trình duyệt đã kích hoạt nó.

Bằng cách đó, bạn có nội dung dự phòng cho người dùng mà không cần javascript, bạn giữ hợp pháp và bạn giữ cho mọi người và chú chó của họ hạnh phúc :)


Chỉnh sửa tuyệt vời về dự phòng! Nếu chúng tôi sử dụng URL ajax trong href của liên kết, trang gọi có thể là HTML có thể kết xuất được không nếu javascript bị vô hiệu hóa? Tôi đã từng có print drupal_json_output($output)trong trang gọi ajax của tôi.
Sithu

4

Bạn không thể sử dụng sạch #.

Nhưng có thể thêm space symbolsau #:

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

2

Tôi chỉ có cùng một vấn đề, nhưng không có giải pháp nào thỏa mãn, vì vậy tôi đã đưa ra giải pháp của riêng mình:

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

Điều này tạo ra một sạch #

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

Đóng, điều này sản xuất <a href="# ">link</a>cho tôi.
tyler.frankenstein

1

Tôi sẽ sử dụng loại kết xuất html_tag thay vì tôi tin rằng liên kết kết xuất nhận được sự chú ý đặc biệt từ Drupal. Nhược điểm là không có chức năng cắt ngắn cho nó, vì vậy chúng tôi sẽ phải sử dụng một mảng kết xuất:

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

0

Về cơ bản, đây là cùng một câu trả lời tôi đã đăng ở đây ... Đặt fragmentthành một khoảng trắng sẽ chuyển thành a #$current_pathđược bao gồm vì nếu không, liên kết sẽ chỉ được đặt thành www.example.com/#thay vì www.example.com/current-page#:

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

Không cần lấy bí danh đường dẫn vì l () sẽ chuyển đổi thành bí danh cho bạn. Nó thực sự là tốt hơn để sử dụng một con đường không răng cưa.
rooby
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.