l()でEMPTYアンカーのみのリンクを作成する方法は?


20

私は、ajax呼び出しの目的で、のl()ようなものを取得しようとしてい<a href='#' ...>ます。 /programming/1698453/drupal-creating-anchor-only-link-with-lはまさに正しいことです-のl()ような'fragment' => 'foo'リンクを作成するためにオプションを使用します<a href='#foo'...>-しかし、私はきれいな「#」を取得しようとしています。これを行う方法はありますか、それともフラグメントの一部として何かを入れて、それを心配する必要はありませんか?

回答:


12

fragmentでクリーンな「#」を使用できない場合は、を使用することをお勧めします<a href="javascript:">link</a>。属性に
「javascript:」または「javascript:void(0)」を追加hrefすると、<a>タグは何もしません。次に、ajaxの目的で「onclick」をリンクにバインドできます。次のように関数を
使用してこれを実装できl()ます。

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

どうjavascript:void(0)
ですか-Serjas

1
@Serjas、javascript:およびjavascript:void(0)同じです。唯一の違いは「void(0)」です:)
シチュ

つまり、l()は()を変換しますか?
セルハス

6
このようなシェナンガンは決して使用しないで、イベント駆動型JavaScriptを使用してください。これは2004年ではなく2012年です。なぜこのような低品質の回答が投票されるのですか?簡単だから人気がある?しかし、それは非常に間違っています。:(

@chx、あなたはdrupalコアメンテナーなので、パスまたはフラグメントではなくl()関数の2番目のパラメーターを使用しないように虐待していないことを願っています。残念ながら、この関数はパスとして「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、デフォルトで「d」になっていることを確認してください。Drupalは.jshtmlにクラスを持ち、javascriptが実行されたときにそれを表示します。


7

残念ながら、このurl()関数(l()内部で呼び出す)は、次の行で空のフラグメントの可能性をほとんど無効にします。

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

フラグメントが空の文字列ではないことを確認します。空の文字列は、cleanを取得するために渡す必要があるものです#。最も簡単な解決策は、ページのどこかで適切な要素のIDを選択し、代わりにフラグメントに使用することだと思います(またはjavascript:voidSithuが述べたように)。

しかし...最もアクセスしやすい方法(そして、その後、多くの国では法的方法。米国のセクション508、英国のDDAなど)は、上のリンクによってロード/調整されているコンテンツを提供することです。別のページを作成し、代わりにそのページのURLをリンクのhrefとして使用します。次に、javascriptを使用して、リンク上のイベントが、それを有効にしているブラウザーのページを実際にリダイレクトしないようにします。

そうすれば、javascriptを使用していないユーザー向けのフォールバックコンテンツがあり、合法性を保ち、すべての人とその犬を幸せに保つことができます。


フォールバックに関する素晴らしい編集!リンクのhrefでajax URLを使用している場合、javascriptが無効になっている場合、呼び出しページをレンダリング可能なHTMLにできますか?私は今までprint drupal_json_output($output)私のajax呼び出しページにいました。
シチュ

4

cleanを使用できませんでした#

しかし、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

レンダーリンクはDrupalから特別な注意を引くと信じているため、代わりにレンダータイプhtml_tagを使用します。欠点は、ショートカット機能がないため、レンダー配列を使用する必要があることです。

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

0

これは基本的に私が掲示同じ答えである、ここで設定... fragmentに変換されます1つのスペースに#、そして$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()はエイリアスに変換するため、パスエイリアスを取得する必要はありません。実際には、エイリアスのないパスを使用することをお勧めします。
ルービー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.