過去ログ表示


過去ログ 339 を表示

トピック内全 9 記事中の 1 〜 9 番目を表示
[ 最新記事及び返信フォームをトピックトップへ ]
このトピックの全ページ / [0]

FireGesturesのスクリプトの質問
(#51873) このトピック中1番目の投稿
(環境: WinXP SP3/Firefox3.5)

FireGesturesのスクリプトについての質問です。
公式にある次へのリンクを辿るスクリプトを導入しましたが、キーワードを順番に調べるのではなく、キーワードがのどれかが含まれた最初のリンクを開いてしまうようでした。
キーワードの先頭に指定されているものから順番に検索させたいと思い、下記のようにスクリプトを書き換えましたが、出来ませんでした。
望むように動作させるにはどのように書き換えれば良いのでしょうか。
プログラミングはある程度はわかりますが、とても詳しい、と言うわけではありません。よろしくお願いします。

const PREV_NEXT = "next";
const KEYWORDS = ["次へ", "続く", "next"];

var doc = FireGestures.sourceNode.ownerDocument;
var links = doc.getElementsByTagName("link");
for (var i = 0; i < links.length; i++) {
if (links[i].href && links[i].hasAttribute("rel") && links[i].getAttribute("rel").toLowerCase().indexOf(PREV_NEXT) == 0) {
loadURI(links[i].href);
return;
}
}

links = doc.links;
for (j = 0; j < KEYWORDS.length; j++){
for (i = 0; i < links.length; i++) {
if (links[i].href && links[i].textContent && links[i].textContent.match(KEYWORDS[j])) {
loadURI(links[i].href);
return;
}
}
}

Re: FireGesturesのスクリプトの質問
(#51880) このトピック中2番目の投稿
(環境: WinXP SP3/Other)

> 望むように動作させるにはどのように書き換えれば良いのでしょうか。

書き換えた、というのは、書き換えた結果const PREV_NEXT...;const KEYWORDS...;になっている、というのではなく、
const PREV_NEXT...→const KEYWORDS...に、var links = doc.getElementsByTagName("link");...;return}}→links = doc.links;...;return}}に置き換えたということである、と解釈します。

望むような動作が何かが不明だから、答えようがない...

望むような動作はオリジナルのスクリプトと同じで、Nextで始まるものだけでなく、「次へ」や「続く」で始まるものについても動かしたいだけ?

望むような動作のために以下のように書き換えた?

var links = doc.getElementsByTagName("link");
→ links = doc.links;
> https://developer.mozilla.org/en/DOM/document.links
> http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-7068919

links[i].hasAttribute("rel") && links[i].getAttribute("rel").toLowerCase().indexOf(PREV_NEXT) == 0
→links[i].textContent && links[i].textContent.match(KEYWORDS[j])

> 公式にある次へのリンクを辿るスクリプトを導入しましたが、
> キーワードを順番に調べるのではなく、キーワードがのどれかが含まれた最初のリンクを開いてしまうようでした。
> キーワードの先頭に指定されているものから順番に検索させたいと思い、下記のようにスクリプトを書き換えましたが、出来ませんでした。

「あるKEYWORDS[j]について、linksアレイの全てについてチェック」を、全てのjに対して行うでも、
「あるlinks[i]について、KEYWORDSアレイの全てについてチェック」を、全てのiに対して行うでも、
全部の組み合わせのチェックができますが、
最初にヒットするのがどれになるかは、ページ内にどのようなデータの要素がどのような順番で置かれているかによって変わります。
また、JavaScriptで挿入や移動をしていると、HTMLソースをパッと見たときとは異なる順番でHTML要素のアレイが返ります。

DOM上での状況は、ページで「全選択」し、コンテキストメニューで選択した部分のソースを表示すると、挿入されたものなども含めたDOM上の構成を、HTMLソースの形式でみることができます。

また、複数の要素をアレイで返す時どのような順で返すかについては規定されていません。
どのブラウザーでも、最初からHTML上にあって場所を変えていない場合はHTMLに書いてある順番になるようにしていますし、基本的にはDOMの構造内の順にしているはずですが。
urlバーで、javascript:{各種変数にデータを入れる;}var m='';var NL='¥n';for(var i=0;i<links.length;i++)
{ m+= (表示したいlinks[i]のデータなど) + NL; } alert(m);
とでもすると、簡単にチェックできます。

Re: FireGesturesのスクリプトの質問
(#51881) このトピック中3番目の投稿
(環境: WinXP SP3/Other)

追記。

以下のスクリプトを一行にしてURLバーで実行し、<a>タグ内のキーワードの位置を確認してみてください。
各<a>タグの中に、期待したような文字列で(nextが小文字で)、期待したような位置で期待したような順番に、キーワードの文字列が置かれていますか?
今のロジックは、それらの中から自分の思ったようなものを最初に見つけるようになっていますか?

javascript:
var KEYS=["次へ","続く","next","表示","スレッド","トピック","ツリー"];
var NL='\n';
function chk_pos(obj,KEYS)
{
var txt,pos,j,p;
txt=obj.textContent.toLowerCase();
pos='';
for(j=0;j<KEYS.length;j++)
{
p=txt.indexOf(KEYS[j]);
pos+=KEYS[j]+'='+p+',';
}
return pos;
}
var links,m,i,pos,url;
links=document.links;
m='';
for(i=0;i<links.length;i++)
{
url=links[i].href;
pos=chk_pos(links[i],KEYS);
m+='I='+i+','+pos+url+NL;
}
alert(m);

ところで、constにすると、二回目以降、redeclaration of constとか言われてエラーになりませんか?

Re: FireGesturesのスクリプトの質問
(#51887) このトピック中4番目の投稿
(環境: WinXP SP3/Other)

追記その2。

> キーワードを順番に調べるのではなく、キーワードがのどれかが含まれた最初のリンクを開いてしまうようでした。
> 望むように動作させるにはどのように書き換えれば良いのでしようか。

「望むように動作させる」がどのようになって欲しいのか全然わからん、ということはおいといて...

links[0]にはKEYWORDS[2]だけがあり、links[1]にはKEYWORDS[1]だけがあり、links[2]にはKEYWORDS[0]だけがある、という場合、
(A)「あるKEYWORDS[j]について、linksアレイの全てについてチェック」を、全てのjに対して行う、だと、
links[2]のKEYWORDS[0]、links[1]のKEYWORDS[1]、links[0]のKEYWORDS[2]、の順にヒットしますが、
(B)「あるlinks[i]について、KEYWORDSアレイの全てについてチェック」を、全てのiに対して行う、だと、
links[0]のKEYWORDS[2]、links[1]のKEYWORDS[1]、links[2]のKEYWORDS[0]、の順にヒットします。
書き換えた結果だと考えられるスクリプトは(A)の方式で、linksの全てについてKEYWORDSのそれぞれの要素の位置をチェックする例示したスクリプトは(B)の方式。
このあたりは理解した上で、オリジナルのコードを書き換えていますか?

Re: FireGesturesのスクリプトの質問
(#51888) このトピック中5番目の投稿
(環境: WinXP SP3/Firefox3.5)

返信ありがとうございます。
諸々の説明不足、本当に申し訳ありません。
元コードを乗せて良いのか判断が付かず乗せておりませんでした。
リンクを張り、引用させていただきます。
望む動作、と言うのはKEYWORDS配列に指定されている文字列を1つ目から順番に検索を行い、移動する。という動作です。
KEYWORDS = ["次へ", "NEXT"]と指定されていた場合、まず"次へ"と言う文字列がlinksアレイのいずれかに含まれていればそのページへ移動し、含まれて居なければ"NEXT"という文字列が含まれているページへ移動する、と言う事です。
<html>
<body>
<a href="./test2.html"><b>NEXT</b></a>
<a href="./test3.html"><b>次へ</b></a>
</body>
</html>
aタグが使用できないとのことで、aタグのみ大文字にしております。
このようなページの場合、test2.htmlでは無く、test3.htmlへ移動を行いたいのです。

書き換えについては、以下に書き換え元コードと書き換え後のコードを示します。
本来のソースではKEYWORDS配列は、
const KEYWORDS = ["next", "次へ"];
となっていましたが、この部分については書き換えて問題ないと判断し、変更を加えています。


http://www.xuldev.org/firegestures/getscripts.php
元スクリプトは上記ページの「前のページ / 次のページ (リンク自動検出)」です。
/* 書き換え前のスクリプト */
// derived from All-in-One Gestures created by Marc Boullet

////////////////////////////////////////////////////////////////
// OPTIONS

// "prev" or "next"
// const PREV_NEXT = "prev";
const PREV_NEXT = "next";

// part of string which the link should contain
// const KEYWORDS = ["prev", "前へ"];
const KEYWORDS = ["次へ", "NEXT"];

////////////////////////////////////////////////////////////////
// PROGRAM

// first, we search for LINK tags
var doc = FireGestures.sourceNode.ownerDocument;
var links = doc.getElementsByTagName("link");
for (var i = 0; i < links.length; i++) {
if (links[i].href &&
links[i].hasAttribute("rel") &&
links[i].getAttribute("rel").toLowerCase().indexOf(PREV_NEXT) == 0) {
loadURI(links[i].href);
return;
}
}

// second, we search for A tags
var regexp = new RegExp("(?:" + KEYWORDS.join("|") + ")", "i");
links = doc.links;
for (i = 0; i < links.length; i++) {
if (links[i].href &&
links[i].textContent &&
links[i].textContent.match(regexp)) {
loadURI(links[i].href);
return;
}
}
/* ここまで書き換え前 */
/* 書き換え後 */
const PREV_NEXT = "next";
const KEYWORDS = ["次へ", "NEXT"];

var doc = FireGestures.sourceNode.ownerDocument;
var links = doc.getElementsByTagName("link");
for (var i = 0; i < links.length; i++) {
if (links[i].href && links[i].hasAttribute("rel") && links[i].getAttribute("rel").toLowerCase().indexOf(PREV_NEXT) == 0) {
loadURI(links[i].href);
return;
}
}

links = doc.links;
for (j = 0; j < KEYWORDS.length; j++){
for (i = 0; i < links.length; i++) {
if (links[i].href && links[i].textContent && links[i].textContent.match(KEYWORDS[j])) {
loadURI(links[i].href);
return;
}
}
}
/* ここまで書き換え後 */

追記1は確認しましたが、上記のような簡単なページにてテストしたため、当然のように順番通りでした。
追記2については理解しており、仰るとおりA方式を希望して書き換えております。

Re: FireGesturesのスクリプトの質問
(#51890) このトピック中6番目の投稿
(環境: WinXP SP3/Other)

> 望む動作、と言うのはKEYWORDS配列に指定されている文字列を1つ目から順番に検索を行い、移動する。という動作です。
> KEYWORDS = ["次へ", "NEXT"]と指定されていた場合、まず"次へ"と言う文字列がlinksアレイのいずれかに含まれていればそのページへ移動し、含まれて居なければ"NEXT"という文字列が含まれているページへ移動する、と言う事です。
> <html>
> <body>
> <a href="./test2.html"><b>NEXT</b></a>
> <a href="./test3.html"><b>次へ</b></a>
> </body>
> </html>
> aタグが使用できないとのことで、aタグのみ大文字にしております。
> このようなページの場合、test2.htmlでは無く、test3.htmlへ移動を行いたいのです。

> 追記2については理解しており、仰るとおりA方式を希望して書き換えております。

了解。

> 本来のソースではKEYWORDS配列は、
> const KEYWORDS = ["next", "次へ"];
> となっていましたが、この部分については書き換えて問題ないと判断し、変更を加えています。

追記の方にも書いたのですが、constの場合、一度設定すると、定義を消さないと二重に定義していると叱られるはずですが、そのあたりの問題はないですか?

> // second, we search for A tags
> var regexp = new RegExp("(?:" + KEYWORDS.join("|") + ")", "i");
> links = doc.links;
> for (i = 0; i < links.length; i++) {
>(snip)
links[i].textContent.match(regexp)
>(snip)
> /* ここまで書き換え前 */

この場合、それぞれのiについてregexpを使ってチェックしていますから、A方式ではなくB方式であり、その条件は、"|"でjoinしていますから、KEYWORDSの要素について順番にチェックするのではなく、KEYWORDSの要素のどれかが含まれている、という条件になるはずです。
書き換えたあとのコードがきちんと動いていますか?

オリジナルは、<link>要素のほうではindexOfで'next'との直接比較を行うのでtoLowerCase()で小文字にしていますが、<a>要素のほうでは、regexpでCase Insensitiveの比較をしているのでtoLowerCase()は使っていません。
書き換え後の<a>要素の処理部分では、regexpではなく、またtoLowerCase()も使っていないですから、nextやNextは絶対にヒットしません。
このあたりの問題はないですか?
(位置のチェックのスクリプトでは、定義値のアレイにはnextをいれ、比較時にはtoLowerCase()を使い、nextもNextもNEXTもヒットするようにしています)

なお、<link>要素の処理部分は変える予定もないようですし、当面の、<a>要素の処理部分のチェックのためには、<link>要素の処理部分はコメントにして取り除いておいたほうが、余計なことに気を使わなくてすむ分、各種のチェックが楽になるでしょう。

Re: FireGesturesのスクリプトの質問
(#51955) このトピック中7番目の投稿
(環境: WinXP SP3/Firefox3.5)

返信が遅くなってしまい申し訳ありません。
「望む動作」が出来ましたので報告いたします。
結論としては、一番初め、こちらで相談したコードで動きました。
スクリプトの書き換えを行った際、いくつかファイルに分けてテストを行っていたのですが、その際、古いバージョンのファイルをコピーしていたのが原因でした。
本当に申し訳ありません。。

> 追記の方にも書いたのですが、constの場合、一度設定すると、定義を消さないと二重に定義していると叱られるはずですが、そのあたりの問題はないですか?

申し訳ありません、見落としてました。
constの定義については、問題なく稼動しています。


> オリジナルは、<link>要素のほうではindexOfで'next'との直接比較を行うのでtoLowerCase()で小文字にしていますが、<a>要素のほうでは、regexpでCase Insensitiveの比較をしているのでtoLowerCase()は使っていません。
> 書き換え後の<a>要素の処理部分では、regexpではなく、またtoLowerCase()も使っていないですから、nextやNextは絶対にヒットしません。
> このあたりの問題はないですか?
> (位置のチェックのスクリプトでは、定義値のアレイにはnextをいれ、比較時にはtoLowerCase()を使い、nextもNextもNEXTもヒットするようにしています)

toLowerCaseについては現状まったく考えておりませんでしたが、この説明を見てコードを改善する事が出来ました。

最終的に作成したコードは以下になります。
/* 最終コード */
const PREV_NEXT = "next";
const KEYWORDS = ["次へ", "next"];

var doc = FireGestures.sourceNode.ownerDocument;
var links = doc.getElementsByTagName("link");
for (var i = 0; i < links.length; i++)
{
if (
links[i].href &&
links[i].hasAttribute("rel") &&
links[i].getAttribute("rel").toLowerCase().indexOf(PREV_NEXT) == 0)
{
loadURI(links[i].href);
return;
}
}

links = doc.links;
for (i = 0; i < KEYWORDS.length; i++)
{
for (j = 0; j < links.length; j++)
{
if (
links[j].href &&
links[j].textContent &&
links[j].textContent.toLowerCase().match(KEYWORDS[i].toLowerCase()))
{
loadURI(links[j].href);
return;
}
}
}
/* ここまで */

最後になってしまいましたが、WADAさんにはたくさんの助言を頂き、本当にありがとうございました。
キーワードを追加することで様々なページで快適にブラウジングが行えるようになりました。
済!
Re: FireGesturesのスクリプトの質問
(#51956) このトピック中8番目の投稿
(環境: WinXP SP3/Firefox3.5)

最終スクリプトを間違えていました。
正しくはこちらです。

/* ここから */
//prev or next
const PREV_NEXT = "next";
//const KEYWORDS = ["前へ", "PREV"]
const KEYWORDS = ["次へ", "NEXT"];

var doc = FireGestures.sourceNode.ownerDocument;
var links = doc.getElementsByTagName("link");
for (var i = 0; i < links.length; i++)
{
if (
links[i].href &&
links[i].hasAttribute("rel") &&
links[i].getAttribute("rel").toLowerCase().indexOf(PREV_NEXT) == 0)
{
loadURI(links[i].href);
return;
}
}
links = doc.links;
for (i = 0; i < KEYWORDS.length; i++)
{
for (j = 0; j < links.length; j++)
{
regexp = new RegExp("^"+ KEYWORDS[i].toLowerCase() + "$", "i");
if (
links[j].href &&
links[j].textContent &&
links[j].textContent.match(regexp))
{
loadURI(links[j].href);
return;
}
}
}
/* ここまで */
済!
Re: FireGesturesのスクリプトの質問
(#51957) このトピック中9番目の投稿
(環境: WinXP SP3/Other)

> 「望む動作」が出来ましたので報告いたします。
> 結論としては、一番初め、こちらで相談したコードで動きました。
> スクリプトの書き換えを行った際、いくつかファイルに分けてテストを行っていたのですが、その際、古いバージョンのファイルをコピーしていたのが原因でした。

やっぱり、思っているのとは別なコードが動いていた、でしたか。
提示された変更後のコードだと、英数の文字列はNEXTしか引っかけられなくてnextやNextが引っかからないだけで、どれかの条件でヒットする、というような現象にはなり得ないですから。

> キーワードを追加することで様々なページで快適にブラウジングが行えるようになりました。

よかったですね。
コーディング上はどう考えても絶対に正しいはずなのに、思っているのとは全然違う動きをして、ソースコード上で呼び出しているモジュールとは全く異なるモジュールに飛んでしまう、という現象に、若い頃に出会って随分悩んだのですが、
それは、コンパイラーのバグでブランチテーブルが狂ってしまい、ソースコード上の呼び出しとは全然別のモジュールを呼びだしてしまう問題だ、とわかった時のことを思い出しました。
自分が書いているコードとは全然別な動きをしているなんて、普通、誰も想像しないですよね(^^;
済!

このトピックの全ページ / [0]

返信不可


- Child Tree -