Пожалуйста, проверьте мой Javascript Snippet. Это скрипт greasemonkey для FB Mobwars - PullRequest
0 голосов
/ 18 марта 2009

Эй, ребята, я практикую свое программирование на Javascript, разрабатывая сценарии greasemonkey, теоретически это улучшило бы мое кодирование javascript, потому что это сырой javascript.

Итак, сейчас я пишу скрипт для Mobwars facebook. Это игра, в которой вы убиваете людей, крадете вещи, создаете мобов и т. Д. И т. Д.

Чтобы лучше это понять, вот скриншот страницы:

альтернативный текст http://www.picamatic.com/show/2009/03/18/08/11/2877480_703x486.png Я пытаюсь отсканировать страницу, получить название задания и показать его пользователю.

Я хочу получить текст Mugging, Дом Кражи со взломом, Кража Стоп-сигнала и т. Д. И т. Д.

Текст имеет свойство цвета, которое установлено в серебро.

Посмотрите на мой код, я попробовал его в Firebug, но он даже не предупредил ..

var jobs = {};

jobs.scan = function() {
    var tagHolder = {};
    var availJobs = {};
    var jobContents = dom.get("app8743457343_content");
    var rData = dom.getElementsByClass(rowData, jobContents, "tr");
    for(var i = 0; i < rData.length; i++) {
        var rChildren = rData[i].childNodes;
        for(var j = 0; j < rChildren.length; j++) {
            if(rChildren[j].tagName === "B") {
                tagHolder.push(rChildren[j]);
            }
        }
        for(var k = 0; k < tagHolder.length; k++) {
            if (tagHolder[k].color == "silver") {
                availJobs.push(tagHolder[k].textContent);
            }
        }
    }
    return alert(availJobs[0]);
}

jobs.scan();

Просто скажите мне, что не так с кодом ... Я просто настрою этот код и, возможно, если мне удастся его исправить, я сообщу об этом здесь снова. Спасибо

Ответы [ 3 ]

2 голосов
/ 18 марта 2009

Есть ли у вас пользовательская функция getElementsByClass? DOM не имеет метода getElementsByClass. Возможно, вы пытались позаимствовать код из другого места и не поняли этого?

В Интернете доступно множество методов getElementsByClass

1 голос
/ 16 июня 2009

+ 1 для ybo, ваш ответ был точным с учетом имеющейся информации. Я быстро взглянул на соответствующую разметку со страницы Mob Wars, и она выглядит так:

<div id="app8743457343_content" fbcontext="db6ca1f1773e">
 ...
   <b style="font-size: 15px; color: silver;">Mugging</b>
 ...

Я изменил ваше решение на основе фактической разметки до:

// ==UserScript==
// @name          Mob Wars Job List
// @namespace     namespace
// @description   Script to summarise available Mob Wars jobs.
// @include       http://apps.facebook.com/mobwars/jobs/
// @require       http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js
// ==/UserScript==

$(document).ready(function() {
var jobs = {};
jobs.scan = function() {
    var availJobs = new Array();
    $("#app8743457343_content b").each(function() {
        if ($(this).css("color") == "silver")
            availJobs.push($(this).text());
    });
    return alert("Available jobs:\n" + availJobs.join('\n'));
}
jobs.scan();
});
1 голос
/ 18 марта 2009

+ 1 для Перчика, если вы не предоставите определение используемых функций, а также HTML-код, на котором он должен работать, мы не сможем помочь вам проверить ваш код.

В любом случае, я все еще вижу две вещи, которые вы можете изменить. Первый - инициализировать ваши массивы как массивы, а не как пустые объекты. Вы не можете использовать метод push, если ваша переменная не является массивом:

var tagHolder = new Array();
var availJobs = new Array();

Второй - использовать jQuery или любую другую библиотеку javascript, которая может сделать вашу жизнь проще. В GreaseMonkey вы можете использовать @require:

// ==UserScript==
// @name           Script Name
// @namespace      namespace
// @include        http://www.website.net/*
// @require        http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js
// ==/UserScript==

Сценарии @required извлекаются , когда вы добавляете свой сценарий в GreaseMonkey: если вы хотите его использовать, вам придется удалить его и перезагрузить. GreaseMonkey сохранит локальную копию сценариев @required и загрузит их при необходимости.

С jQuery ваш код будет выглядеть так:

var jobs = {};

jobs.scan = function() {
    var tagHolder = new Array();
    var availJobs = new Array();
    $("#app8743457343_content b").each(function() {
        tagHolder.push(this);
        if ($(this).attr("color") == "silver")
            availJobs.push($(this).text());
    });
    return alert(availJobs[0]);
}

jobs.scan();
...