2

我想知道用户在我的 Javascript 代码中输入的给定 url 的内容类型。实际上,我有一个下拉列表(html、csv、xls 等),我想这样做,所以当用户输入一个 url 时,我想检测 url 内容的类型并基于这种类型我想要设置我的下拉列表的值(html、csv、xls 等)。我知道,我可以像这样使用 Ruby 获取内容类型:

require 'open-uri'
str = open('http://example.com')
str.content_type #=> "text/html"

或者,我也可以使用 curl 获取内容,然后解析它以了解内容类型。但是,由于上面解释了我的需要,我需要在我的 Javascript 代码中执行此操作。任何想法 ?

编辑_1:

我在我的 javascript 中尝试了这段代码:

    $("#wiki_form_url").change(function(){
        $.ajax({
            type: "GET",
            url: "content.rb",
            data: {
//                input_url: $("#wiki_form_url").val()
            },
            dataType: "html"
        }).done(function (data) {
                    // `data` contains the content-type
                    alert('Success !!!');
                }).fail(function () {
                    alert("failed AJAX call");
                });
    });

我有一个 ruby​​ 脚本 content.rb 我在里面做:

require 'open-uri'

str = open('http://www.ofdp.org/benchmark_indices/25')
str.content_type

但是,它似乎不起作用。我遇到了 Ajax 失败。可能是因为脚本 content.rb 的 url 路径?我应该如何在这里指定脚本路径?(相对或绝对)

4

3 回答 3

1

同源策略阻止您使用客户端 JavaScript 直接发现有关任意 URI 的信息(您控制的 URI 是另一回事)。

您需要使用另一种技术(例如服务器端 Ruby)来获取该信息。

您可以通过简单地向服务器提交表单并将新网页返回到浏览器来完成此操作。

如果您不想离开页面,那么您可以使用 Ajax 传递数据。那里不乏 Ajax 教程,这里有一篇来自 MDN 的好教程。

于 2013-03-28T15:39:12.330 回答
0

这是一个 AJAX 调用的示例:

$(document).ready(function () {
    $("#button_check").on("click", function () {
        $.ajax({
            type: "GET",
            url: "Your URL",
            data: {
                input_url: $("#textbox_id").val()
            },
            dataType: "html"
        }).done(function (data) {
            // `data` contains the content-type
            alert(data);
        }).fail(function () {
            alert("failed AJAX call");
        });
    });
});

您的 HTML 类似于:

<input type="text" id="textbox_id" />
<input type="button" id="button_check" value="Submit" />

您的 Ruby 代码将类似于:

require 'open-uri'
class TestController < ApplicationController
  def index
    req = open(params[:input_url])
    render :text => req.content_type
  end
end

我以前从未使用过 RoR,所以我不知道这是否正确或是否有效。但这是我在翻阅几个教程时可以快速想到的。这只是您似乎正在寻找的概念。您需要弄清楚如何将 URL 映射到此方法,然后更新 AJAX 选项url以使用该方法。

所以在 Javascript 代码中 - 在done方法中,这意味着整个 AJAX 请求是成功的,并且data变量应该包含来自 Ruby 代码的结果req.content_type

于 2013-03-28T16:02:25.677 回答
0

Atlast 在@Ian 的大力帮助下,我可以弄清楚整个事情。这是我完成的代码:在 javascript 文件中:

    $("#wiki_form_url").change(function () {
        $.ajax({
            type: "GET",
            url: "/wiki_forms/content",
            data: {
                input_url: $("#wiki_form_url").val()
            },
            dataType: "text"
        }).done(function (data) {
                    // `data` contains the content-type
                    alert('Success');
                    console.log(data);
//                    alert(data);
                }).fail(function () {
                    alert("failed AJAX call");
                });
    });

在我的 wiki_forms 控制器中,我创建了一个名为 content 的新方法:

  def content 
    req = open(params[:input_url])
    render :text => req.content_type 
  end

然后在 routes.rb 文件中添加了一条新路由:

  get "/wiki_forms/content" => 'wiki_forms#content'

并使用/wiki_forms/content作为 ajax 请求 url。而且,现在一切都运行良好。

于 2013-03-28T19:03:20.580 回答