Як створити зв'язок EMPTY, призначений лише для прив’язки до 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>.
Додаючи hrefатрибут "javascript:" або "javascript: void (0)" , <a>тег нічого не зробить. Тоді ви можете прив’язати "onclick" до посилання для своїх цілей ajax.
Ви можете реалізувати це за допомогою l()функції, наведеної нижче:

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

про щоjavascript:void(0)
Сержас

1
@Serjas, javascript:і javascript:void(0)те саме. Єдина різниця - "void (0)" :)
Sithu

Я маю на увазі, що я (() перетворить ()?
Сержас

6
Ви ніколи не використовуйте таких шенагінів і просто використовуйте JavaScript, керований подіями! Це 2012 рік, а не 2004. Чому за такі низькоякісні відповіді голосують? Популярний тому, що це легко? Але це вкрай неправильно. :(

@chx, оскільки ви підтримувач ядра drupal, я сподіваюся, що ви не зловживаєте не використовувати другий параметр для функції l (), а не шлях або фрагмент. На жаль, функція приймає "javascript" як шлях :) Якщо це вкрай неправильно, чому Drupal приймає це. Можливо, це буде обмежено в пізніших версіях Drupal.
Сіту

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-рядків вручну, так?

Постскрипт:

Я не впевнений, що насправді рекомендую надрукувати подібне посилання з php за звичайних обставин. Без вашого JavaScript, все це посилання зробить це, коли він перескочить вашого користувача на верхню частину сторінки ( що, на моє легке здивування, є просте поведінка ). Це, мабуть, має вказувати десь, що працює без javascript.

Якщо посилання насправді має сенс лише з javascript навколо (наприклад, елементи керування для слайд-шоу, призначені лише для js або щось подібне), я думаю, що краще додати посилання на сторінку за допомогою JavaScript. Крім того, якщо ви дійсно хочете помістити його у свій джерело, переконайтеся, що це display:noneза замовчуванням. Drupal має .jsклас на html, щоб потім показувати його, коли javascript є навколо.


7

На жаль, url()функція (яка l()викликає внутрішньо) в значній мірі зводить будь-який шанс на порожній фрагмент із наступними рядками:

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

Він перевіряє, чи впевнений, що фрагмент не є порожнім рядком, який вам потрібно буде пройти, щоб отримати чистий #. Я думаю, що найпростішим рішенням було б вибрати ідентифікатор відповідного елемента десь на сторінці та використати його для фрагмента замість цього (або javascript:voidяк згадував Sithu).

Однак ... найдоступнішим способом (а згодом у багатьох країнах правовим способом; думаю, розділ 508 у Штатах, DDA у Великобританії тощо) - це надання вмісту, який завантажується / коригується вашим посиланням на окрему сторінку, і використовуйте URL-адресу для цієї сторінки як href посилання. Потім ви використовуєте javascript, щоб зупинити подію по посиланню від фактичного перенаправлення сторінки для тих браузерів, які ввімкнули її.

Таким чином, ви маєте резервний вміст для користувачів без JavaScript, ви залишаєтесь законними, і ви залишаєте щасливими всіх і їх собаку :)


Чудова редакція про запасний! Якщо ми використовуємо URL-адресу ajax у href посилання, чи може сторінка, що викликає, бути HTML, який можна переглянути, якщо JavaScript відключений? У мене коли-небудь було print drupal_json_output($output)на сторінці дзвінків у Ajax.
Сіту

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 () перетвориться на псевдонім для вас. Насправді бажано використовувати шлях, який не має псевдоніму.
рубін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.