Bagaimana cara membuat tautan anchor-only KOSONG dengan l ()?


20

Saya mencoba menggunakan l()untuk mendapatkan sesuatu seperti <a href='#' ...>, untuk keperluan panggilan ajax. /programming/1698453/drupal-creating-anchor-only-link-with-l sangat dekat dengan hal yang benar - gunakan opsi dalam l()suka 'fragment' => 'foo'membuat tautan seperti <a href='#foo'...>- tapi saya mencoba mendapatkan '#' yang bersih. Apakah ada cara untuk melakukan ini, atau haruskah saya memasukkan sesuatu sebagai bagian dari fragmen dan tidak khawatir tentang hal itu?

Jawaban:


12

Jika Anda tidak dapat menggunakan "#" bersih dengan fragmen, saya sarankan Anda untuk menggunakannya <a href="javascript:">link</a>.
Saat menambahkan "javascript:" atau "javascript: void (0)" ke hrefatribut, <a>tag tidak akan melakukan apa pun. Kemudian Anda dapat mengikat "onclick" ke tautan untuk tujuan ajax Anda.
Anda dapat menerapkan l()fungsi penggunaan ini seperti di bawah ini:

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

bagaimana denganjavascript:void(0)
Serjas

1
@ Serjas, javascript:dan javascript:void(0)sama. Satu-satunya perbedaan adalah "void (0)" :)
Sithu

Maksud saya, apakah l () mengkonversi ()?
Serjas

6
Anda seharusnya tidak pernah menggunakan shenanigans semacam itu dan cukup menggunakan JavaScript yang didorong oleh peristiwa! Ini bukan 2012, 2004. Mengapa jawaban berkualitas rendah dipilih? Populer karena mudah? Tapi ini sangat salah. :(

@ chx, karena Anda adalah pengelola inti drupal, saya harap Anda tidak menyalahgunakan untuk tidak menggunakan parameter kedua ke fungsi l () daripada path atau fragmen. Sayangnya, fungsi ini menerima "javascript" sebagai jalur :) Jika sangat salah, mengapa Drupal menerimanya. Mungkin, itu akan dibatasi dalam versi Drupal yang lebih baru.
Sithu

15

PHP mengetik waktu kuis pop! (Pengungkapan penuh: Saya tidak menang di kantor kami).

Seperti yang sudah ditunjukkan, ini adalah kode l()yang kami perhatikan:

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

Jadi inilah pertanyaannya: Nilai apa yang dilemparkan ke string kosong tetapi melewati yang berikut?

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

Jawabannya adalah FALSE:!

Jadi, kita bisa mencoba ini:

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

Yang memberi kita:

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

Untungnya kita dapat menghapus garis miring dengan meneruskan external => TRUE:

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

Yang memberi kita:

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

Ledakan. Hal-hal yang kami lakukan untuk menghindari merangkai string html secara manual, eh?

Nota bene:

Saya tidak yakin saya benar-benar merekomendasikan mencetak tautan seperti ini dari php dalam keadaan normal. Tanpa javascript Anda, semua tautan itu akan membuatnya melompat pengguna Anda ke bagian atas halaman ( yang, sedikit mengejutkan saya, adalah perilaku khusus ). Mungkin harus menunjuk ke suatu tempat yang berfungsi tanpa javascript.

Jika tautan benar-benar hanya masuk akal dengan javascript (seperti kontrol untuk tayangan slide hanya-js atau sesuatu), saya pikir lebih baik menambahkan tautan ke halaman dengan javascript. Atau, jika Anda benar-benar ingin meletakkannya di sumber Anda, pastikan itu display:nonesecara default. Drupal memiliki .jskelas pada html untuk kemudian menunjukkannya ketika javascript ada.


7

Sayangnya url()fungsi (yang l()memanggil secara internal) cukup banyak nukes setiap peluang fragmen kosong dengan baris berikut:

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

Itu memeriksa untuk memastikan fragmen itu bukan string kosong, yang adalah apa yang Anda harus lulus untuk mendapatkan bersih #. Saya pikir solusi termudah adalah dengan memilih id dari elemen yang cocok di suatu tempat di halaman dan menggunakannya untuk fragmen sebagai gantinya (atau javascript:voidseperti yang disebutkan Sithu).

Namun ... cara yang paling mudah diakses (dan selanjutnya, di banyak negara, cara legal; pikirkan bagian 508 di Amerika Serikat, DDA di Inggris, dll.) Adalah menyediakan konten yang sedang dimuat / disesuaikan dengan tautan Anda di halaman terpisah, dan gunakan URL untuk halaman itu sebagai tautan href sebagai gantinya. Anda kemudian akan menggunakan javascript untuk menghentikan acara pada tautan dari benar-benar mengarahkan ulang halaman untuk browser yang telah diaktifkan.

Dengan begitu Anda memiliki konten cadangan untuk pengguna tanpa javascript, Anda tetap legal, dan Anda membuat semua orang dan anjing mereka senang :)


Suntingan hebat tentang fallback! Jika kita menggunakan URL ajax di href tautan, dapatkah halaman panggilan menjadi HTML yang dapat diulang jika javascript dinonaktifkan? Saya pernah punya print drupal_json_output($output)di halaman panggilan ajax saya.
Sithu

4

Anda tidak dapat menggunakan bersih #.

Tetapi mungkin untuk menambahkan space symbolsetelah #:

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

2

Saya hanya memiliki masalah yang sama, tetapi tidak ada solusi yang memuaskan, jadi saya membuat sendiri:

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

Ini menghasilkan bersih #

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

Tutup, ini menghasilkan <a href="# ">link</a>untuk saya.
tyler.frankenstein

1

Saya akan menggunakan render ketik html_tag sebagai gantinya karena saya percaya tautan render menerima perhatian khusus dari Drupal. Kelemahannya adalah tidak ada fungsi pintas untuk itu, jadi kita harus menggunakan array render:

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

0

Ini pada dasarnya adalah jawaban yang sama dengan yang saya posting di sini ... Pengaturan fragmentke satu ruang akan dikonversi menjadi a #, dan $current_pathdisertakan karena jika tidak, tautan hanya akan diatur ke www.example.com/#sebagai ganti www.example.com/current-page#:

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

Tidak perlu mendapatkan path alias karena l () akan dikonversi ke alias untuk Anda. Sebenarnya lebih baik menggunakan jalur non-alias.
rooby
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.