私はl()
を使用して、ajax呼び出しの目的で<a href='#' ...>
のようなものを取得しようとしています。 https://stackoverflow.com/questions/1698453/drupal-creating-anchor-only-link-with-l は適切なものに非常に近い-l()
のオプションを使用する'fragment' => 'foo'
のようなリンクを生成するには<a href='#foo'...>
のようにします-しかし、クリーンな「#」を取得しようとしています。これを行う方法はありますか、それともフラグメントの一部として何かを入れて心配する必要はありませんか?
フラグメントでクリーンな「#」を使用できない場合は、_<a href="javascript:">link</a>
_を使用することをお勧めします。
「javascript:」または「javascript:void(0)」をhref
属性に追加すると、_<a>
_タグは何もしません。次に、「onclick」をリンクにバインドして、ajaxの目的に使用できます。
これは、以下のようにl()
関数を使用して実装できます。
_ l('link', 'javascript:', array('external' => TRUE));
_
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なしで動作するどこかを指すはずです。
リンクreallyがJavaScriptでのみ意味がある場合(jsのみのスライドショーのコントロールなど)、JavaScriptを使用してページへのリンクを追加することをお勧めします。または、本当にソースに入れたい場合は、デフォルトでdisplay:none
になっていることを確認してください。 Drupalは、JavaScriptが使用されているときにそれを表示するために、htmlに.js
クラスを持っています。
残念ながら url()
関数(これはl()
が内部で呼び出します)は、次の行で空のフラグメントが発生する可能性をかなり高めています。
if (isset($options['fragment']) && $options['fragment'] !== '') {
$options['fragment'] = '#' . $options['fragment'];
}
フラグメントが空の文字列でないことを確認します。これは、クリーンな#
を取得するために渡す必要があるものです。最も簡単な解決策は、ページ内の適切な要素のIDを選択し、代わりにフラグメントに使用することです(またはSithuが述べたようにjavascript:void
)。
ただし...最もアクセスしやすい方法(そして、多くの国では、合法的な方法。米国では セクション508 、英国では DDA などと考えてください)別のページのリンクによってロード/調整されているコンテンツを提供し、代わりにそのページのURLをリンクのhrefとして使用します。次に、JavaScriptを使用して、リンク上のイベントが、ページが有効になっているブラウザーのページを実際にリダイレクトしないようにします。
これにより、JavaScriptを使用しないユーザー向けのフォールバックコンテンツが作成され、合法性が維持され、すべての人と犬を幸せに保つことができます。
クリーン#
を使用できませんでした。
ただし、space symbol
の後に#
を追加することもできます。
l('Link title', '# ', array('external' => TRUE));
私は同じ問題を抱えていましたが、解決策のどれも満足できなかったので、私は自分の問題を思いつきました:
l('link', '', array('fragment' => ' ', 'html' => TRUE, 'external' => TRUE));
これにより、クリーンな#
<a href="#">link</a>
代わりにレンダータイプhtml_tagを使用します。これは、レンダーlinkがDrupalから特別な注意を引くと考えているためです。欠点はショートカット関数がないため、レンダー配列を使用する必要があることです。
array (
'#type' => 'html_tag',
'#tag' => 'a',
'#attributes' => array (
'href' => '#',
),
);
これは基本的に私が投稿した答えと同じです here ... fragment
を単一のスペースに設定すると#
に変換され、そうでない場合は$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' => ' '));